假设我有一个名为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
是否有方便的方法将变量设置为"记录中的最后一个字段?"这个例子非常简单,但最终FIELD_TO_PRINT变量将放在一个单独的配置文件中,而awk脚本将更大,更复杂。因此,有一个很好的方法来实现这一点非常有用。
答案 0 :(得分:3)
你可以使用这个技巧
$ awk -F, -v n=-1 '{print (n<0)?$(NF+n+1):$n}' file
valueIWantToPrint
valueIWantToPrint
假设负指数从NF向后开始计数,因此-2表示倒数第二个字段等。
答案 1 :(得分:3)
你可以使用这种循环方式:
否定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