将参数编写为变量的awk命令行以搜索特定字段

时间:2013-02-25 14:26:54

标签: linux variables awk

所以我正在尝试编写一个脚本,该脚本将从命令行获取参数并使用所述变量作为字段参数进行打印。该脚本必须使用任何数字或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

我做错了什么?

1 个答案:

答案 0 :(得分: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)}'

请注意,当$0不是可转换为整数字符串且awkvar时,"NF"将被打印。

更合适的检查是:

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

您还可以检查是否int(awkvar) <= NF - 以避免打印""