如何从最后一个字段作为变量的 bash 调用 awk



>假设我有一个名为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 脚本会更大、更复杂。 因此,有一个好的方法来完成这一点将非常有用。

您可以使用这种迂回的方式:

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

你可以使用这个技巧

$ awk -F, -v n=-1 '{print (n<0)?$(NF+n+1):$n}' file
valueIWantToPrint
valueIWantToPrint

假设负指数从 NF 开始向后计数,因此 -2 将表示倒数第二个字段等。

最新更新