我想在awk中打印第二个最后一列或字段 . 字段数是可变的 . 我知道我应该可以使用 $NF 但不知道如何使用它 .
$NF
这似乎不起作用:
awk ' { print ( $NF-- ) } '
awk '{print $(NF-1)}'
应该管用
克里斯·坎农(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 '{print $--NF}'
原始 $NF-- 不起作用的原因是因为在递减之前计算表达式,而在评估之前执行我的前缀递减 .
$NF--
awk ' { print ( $(NF-1) ) }' file
你离结果不远了!这样做:
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
Perl解决方案类似于Chris Kannon的awk解决方案:
perl -lane 'print $F[$#F-1]' file
使用这些命令行选项:
n 循环输入文件的每一行,不要自动打印每一行
n
l 在处理之前删除换行符,然后将其添加回来
l
a autosplit模式 - 将输入行拆分为 @F 数组 . 默认为在空格上拆分
a
@F
e 执行perl代码
e
@F autosplit数组从索引[0]开始,而awk字段以$ 1开头 .$#F 是 @F 中元素的数量
$#F
您是否尝试使用rev命令从右向左开始?在这种情况下,您只需要打印第二列:
seq 12 | xargs -n5 | rev | awk '{ print $2}' | rev 4 9 11
如果你有很多列,想要打印最后一个但不是三个cloumns,那么这可能会有所帮助
awk '{ $NF="";$(NF-1)="";$(NF-2)="" ; print $0 }'
首先递减值然后打印 -
awk ' { print $(--NF)}' file
要么
rev file|cut -d ' ' -f2|rev
9 回答
应该管用
克里斯·坎农(Chris Kannon)接受的答案的一小部分:只有在确实存在第二列的第二列时才打印 .
这是最简单的:
原始
$NF--
不起作用的原因是因为在递减之前计算表达式,而在评估之前执行我的前缀递减 .你离结果不远了!这样做:
这会减少一个字段的数量,因此
$NF
包含前倒数第二个 .测试
让我们生成一些数字并将它们打印在5个组中:
让我们在每一行打印倒数第二个:
Perl解决方案类似于Chris Kannon的awk解决方案:
使用这些命令行选项:
n
循环输入文件的每一行,不要自动打印每一行l
在处理之前删除换行符,然后将其添加回来a
autosplit模式 - 将输入行拆分为@F
数组 . 默认为在空格上拆分e
执行perl代码@F
autosplit数组从索引[0]开始,而awk字段以$ 1开头 .$#F
是@F
中元素的数量您是否尝试使用rev命令从右向左开始?在这种情况下,您只需要打印第二列:
如果你有很多列,想要打印最后一个但不是三个cloumns,那么这可能会有所帮助
awk '{ $NF="";$(NF-1)="";$(NF-2)="" ; print $0 }'
首先递减值然后打印 -
要么