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

Bri*_*n G 157 awk gawk

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

这似乎不起作用:

awk ' { print ( $NF-- )  } '
Run Code Online (Sandbox Code Playgroud)

Chr*_*non 265

awk '{print $(NF-1)}'
Run Code Online (Sandbox Code Playgroud)

应该管用

  • @Gurgeh:发生这种情况是因为`$(..)` 在子shell 中调用命令,具体取决于您使用的shell。您可以通过使用 `$ (NF-1)` 而不是 `$(NF-1)` 来解决这个问题。 (4认同)
  • 我会避免前/后减量,以确保你不改变$ NF的值 (3认同)
  • 这对我不起作用。在Ubuntu下的awk 3.1.8中,我得到“ title:5:找不到命令:NF-1”。 (2认同)

小智 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) ) }'
)
Run Code Online (Sandbox Code Playgroud)


小智 13

这是最简单的:

 awk '{print $--NF}' 
Run Code Online (Sandbox Code Playgroud)

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


gho*_*g74 9

awk ' { print ( $(NF-1) ) }' file
Run Code Online (Sandbox Code Playgroud)


VIP*_*MAR 6

首先递减该值,然后打印它 -

awk ' { print $(--NF)}' file
Run Code Online (Sandbox Code Playgroud)

或者

rev file|cut -d ' ' -f2|rev
Run Code Online (Sandbox Code Playgroud)


fed*_*qui 5

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

awk '{NF--; print $NF}' file
Run Code Online (Sandbox Code Playgroud)

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

测试

让我们生成一些数字并将它们打印在 5 组中:

$ seq 12 | xargs -n5
1 2 3 4 5
6 7 8 9 10
11 12
Run Code Online (Sandbox Code Playgroud)

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

$ seq 12 | xargs -n5 | awk '{NF--; print $NF}'
4
9
11
Run Code Online (Sandbox Code Playgroud)