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