0

所以我正在尝试编写一个脚本,该脚本将从命令行获取一个参数并将所述变量用作要打印的字段参数。该脚本必须使用任何数字或 NF。

所以,

echo a b c | ./awkprint.sh 1 

将打印第一个字段 (a)

和,

echo a b c | ./awkprint.sh NF 

将打印最后一个字段 (c)。

这是我在脚本中的行

awk -v awkvar=$1 '{print $awkvar}'

它适用于我在命令行上使用的任何数字......但是,一旦我使用 NF,它似乎将其视为 $0 并打印所有字段,因此我得到:

echo a b c | ./awkprint.sh NF

a b c

代替,

echo a b c | ./awkprint.sh NF

c

我究竟做错了什么?

4

1 回答 1

0

这样做是因为字符串"NF"被转换为0.

awk转换过程表明,任何无法转换为有效数字的字符串都会计算为0,因此,给你print $0.

来自man awk

变量类型和转换

  Variables and fields may be (floating  point)  numbers,  or
   strings,  or  both.   How the value of a variable is inter‐
   preted depends upon its context.   If  used  in  a  numeric
   expression,  it  will  be treated as a number; if used as a
   string it will be treated as a string.
   ...
   When a string must be converted to a number, the conversion
   is  accomplished using strtod(3).

man strtod

返回值

  These functions return the converted value, if any.

  ...
  If no conversion is performed, zero is returned and the
  value of nptr is stored in the location referenced by
  endptr.

做你想做的事,你可以写——正如@Ed Morton所指出的:

#!/bin/bash
awk -v awkvar=$1 '{print (awkvar == "NF" ? $NF : $awkvar)}'

但是请注意,$0awkvar它不是可转换为整数的字符串时和它是"NF".

更合适的检查是:

#!/bin/bash
awk -v awkvar=$1 '{
    if (awkvar == "NF") { print; }
    else if (int(awkvar) != 0) { print $awkvar; }
    else { print "Error: invalid field specifier;" }
}'

您也可以检查 if int(awkvar) <= NF-- 以避免打印""

于 2013-02-25T14:35:11.940 回答