在 'awk' 中打印倒数第二列/字段

我想打印awk中倒数第二列或字段。字段的数量是NF变量。我知道我应该能够使用$NF,但我不确定如何使用它。

但这似乎并不奏效:

awk ' { print ( $NF-- )  } '
175451 次浏览
awk '{print $(NF-1)}'

应该工作

awk ' { print ( $(NF-1) ) }' file

对克里斯·坎农(Chris Kannon)公认答案的一个小补充:只有在最后一列有第二列时才打印。

(
echo       | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1     | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1 2   | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1 2 3 | awk 'NF && NF-1 { print ( $(NF-1) ) }'
)

你离结果不远了!这样做:

awk '{NF--; print $NF}' file

这将减少一个字段的数量,因此$NF包含前一个倒数第二个字段。

测试

让我们生成一些数字,并以5为一组打印:

$ seq 12 | xargs -n5
1 2 3 4 5
6 7 8 9 10
11 12

让我们打印每行倒数第二行:

$ seq 12 | xargs -n5 | awk '{NF--; print $NF}'
4
9
11

这是最简单的:

 awk '{print $--NF}'

原来的$NF--没有工作的原因是,表达式是在求值之前求值的,而我的前缀递减是在求值之前执行的。

如果您有很多列,并且希望打印所有列,而不是最后一列的三列,那么这可能会有所帮助

awk '{ $NF="";$(NF-1)="";$(NF-2)="" ; print $0 }'

类似于Chris Kannon的awk解决方案的Perl解决方案:

perl -lane 'print $F[$#F-1]' file

使用以下命令行选项:

  • n循环输入文件的每一行,不会自动打印每一行

  • l在处理之前删除换行符,并在处理之后将它们添加回来

  • a自动拆分模式——将输入行拆分到@F数组中。默认为空格分割

  • e执行perl代码

@F自动拆分数组从索引[0]开始,而awk字段以$1开始 $#F@F

中的元素个数

您是否尝试使用rev命令从右向左开始? 在这种情况下,你只需要打印第二列:

seq 12 | xargs -n5 | rev | awk '{ print $2}' | rev
4
9
11

首先递减值,然后打印它

awk ' { print $(--NF)}' file

rev file|cut -d ' ' -f2|rev
date
Sat Jul  9 11:57:36 EDT 2022


date | gawk '$_=$--NF'


| mawk '$!--NF=$NF'
EDT