在awk中打​​印第二个最后一列/字段

时间:2010-01-19 19:38:39

标签: awk gawk

我想在awk中打​​印第二个最后一列或字段。字段数是可变的。我知道我应该可以使用$NF但不确定如何使用它。

这似乎不起作用:

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

9 个答案:

答案 0 :(得分:255)

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

应该工作

答案 1 :(得分:21)

克里斯·坎农(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) ) }'
)

答案 2 :(得分:13)

这是最简单的:

 awk '{print $--NF}' 

原始$NF--不起作用的原因是因为表达式在递减之前被计算,而我的前缀递减在评估之前执行。

答案 3 :(得分:9)

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

答案 4 :(得分:4)

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

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

答案 5 :(得分:3)

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

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

使用以下命令行选项:

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

  • l在处理之前删除换行符,然后将其添加回来

  • a autosplit模式 - 将输入行拆分为@F数组。默认为在空格上拆分

  • e执行perl代码

@F autosplit数组从索引[0]开始,而awk字段以$ 1开头 $#F@F

中元素的数量

答案 6 :(得分:2)

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

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

答案 7 :(得分:0)

如果你有很多专栏,想要打印最后一个但不是三个cloumns,那么这可能会有所帮助

edges.selectAll("line") .attr("x1", function (d) { return d.source.x+r; }) .attr("y1", function (d) { return d.source.y-r; }) .attr("x2", function (d) { return d.target.x+r; }) .attr("y2", function (d) { return d.target.y-r; });

答案 8 :(得分:0)

首先递减值然后打印 -

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

OR

rev file|cut -d ' ' -f2|rev