如何使用最后一个字段作为变量从 bash 调用 awk
How to call awk from bash with last field as variable
假设我有一个名为 input.csv:
的 CSV 输入文件
1,2,3,valueIWantToPrint
3,5,2,valueIWantToPrint
我目前需要使用 awk 打印该输入的每一行的最后一个元素,这可以使用字段分隔符和 NF 变量轻松完成:
awk -F"," '{print $NF}' input.csv
但是现在假设我想将要打印的字段设置为变量,因为稍后输入格式可能会发生变化,它将是一个不同的字段。
输入文件:
1,2,valueIWantToPrint,3
3,5,valueIWantToPrint,2
脚本:
FIELD_TO_PRINT=3
awk -F"," -v fieldToPrint=FIELD_TO_PRINT '{print $fieldToPrint}' input.csv
好的,这很简单。但是现在为了让它尽可能灵活,我希望能够将 FIELD_TO_PRINT 设置为 NF 的等价物,这样我就可以打印最后一个值,而不管字段的数量。我所追求的是这样的:
输入:
1,2,3,7,2,5,23,1,3,6,valueIWantToPrint
3,5,2,6,3,valueIWantToPrint
此脚本不起作用,但说明了我要完成的任务:
FIELD_TO_PRINT=NF
awk -F"," -v fieldToPrint=FIELD_TO_PRINT '{print $fieldToPrint}' input.csv
有没有一种方便的方法来设置一个变量来表示 "the last field in record?" 这个例子很简单,但最终 FIELD_TO_PRINT 变量将被放在一个单独的配置文件中,awk 脚本将变得更大更复杂。所以有一个好的方法来完成这个将是非常有用的。
你可以使用这个技巧
$ awk -F, -v n=-1 '{print (n<0)?$(NF+n+1):$n}' file
valueIWantToPrint
valueIWantToPrint
假设负索引从 NF 开始向后计数,因此 -2 表示倒数第二个字段等。
你可以使用这种迂回方式:
负数n
表示NF
:
n=-1
awk -F, -v n="$n" '{print (n<0 ? $NF : $n)}' f.csv
valueIWantToPrint
valueIWantToPrint
当 n > 0
打印编号字段时:
n=3
awk -F, -v n="$n" '{print (n<0 ? $NF : $n)}' f.csv
3
2
假设我有一个名为 input.csv:
的 CSV 输入文件1,2,3,valueIWantToPrint
3,5,2,valueIWantToPrint
我目前需要使用 awk 打印该输入的每一行的最后一个元素,这可以使用字段分隔符和 NF 变量轻松完成:
awk -F"," '{print $NF}' input.csv
但是现在假设我想将要打印的字段设置为变量,因为稍后输入格式可能会发生变化,它将是一个不同的字段。
输入文件:
1,2,valueIWantToPrint,3
3,5,valueIWantToPrint,2
脚本:
FIELD_TO_PRINT=3
awk -F"," -v fieldToPrint=FIELD_TO_PRINT '{print $fieldToPrint}' input.csv
好的,这很简单。但是现在为了让它尽可能灵活,我希望能够将 FIELD_TO_PRINT 设置为 NF 的等价物,这样我就可以打印最后一个值,而不管字段的数量。我所追求的是这样的:
输入:
1,2,3,7,2,5,23,1,3,6,valueIWantToPrint
3,5,2,6,3,valueIWantToPrint
此脚本不起作用,但说明了我要完成的任务:
FIELD_TO_PRINT=NF
awk -F"," -v fieldToPrint=FIELD_TO_PRINT '{print $fieldToPrint}' input.csv
有没有一种方便的方法来设置一个变量来表示 "the last field in record?" 这个例子很简单,但最终 FIELD_TO_PRINT 变量将被放在一个单独的配置文件中,awk 脚本将变得更大更复杂。所以有一个好的方法来完成这个将是非常有用的。
你可以使用这个技巧
$ awk -F, -v n=-1 '{print (n<0)?$(NF+n+1):$n}' file
valueIWantToPrint
valueIWantToPrint
假设负索引从 NF 开始向后计数,因此 -2 表示倒数第二个字段等。
你可以使用这种迂回方式:
负数n
表示NF
:
n=-1
awk -F, -v n="$n" '{print (n<0 ? $NF : $n)}' f.csv
valueIWantToPrint
valueIWantToPrint
当 n > 0
打印编号字段时:
n=3
awk -F, -v n="$n" '{print (n<0 ? $NF : $n)}' f.csv
3
2