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


164

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

这似乎不起作用:

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

10
NF是最后一个字段的索引,$NF是最后一个字段的值
glenn jackman 2010年

现在有意义。这就是为什么我认为括号之外的美元起作用了
Brian G

Answers:


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

应该管用


2
这对我不起作用。我在Ubuntu下的awk 3.1.8中收到“标题:5:找不到命令:NF-1”。
Gurgeh

3
我会避免先减后减,以确保您不会更改$ NF的值
Gregory Patmore

如果您尝试获得倒数第三个字段,例如awk -F '.' '{print $(NF-2)}'
gies0r,

3
@Gurgeh:发生这种情况是因为$(..)根据您所使用的shell在子shell中调用命令。您可以使用$ (NF-1)代替来解决此问题$(NF-1)
wting

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) ) }'
)

15

最简单的:

 awk '{print $--NF}' 

原始文件$NF--不起作用的原因是因为表达式是在减量之前求值的,而我的前缀减量是在求值之前执行的。


作为助记符,此行为与C / Java等相同int x = ++i int x = i++。后缀表示以后增加(先分配)。
周末


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

3

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

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

这些命令行选项用于:

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

  • l 在处理之前删除换行符,然后再将其重新添加

  • a自动拆分模式–将输入线拆分为@F阵列。默认为在空白处分割

  • e 执行Perl代码

自动@F拆分数组从索引[0]开始,而awk字段以$ 1开头。
$#F是中的元素数@F


1
或使用perl已提供的负索引...$F[-2]
Sundeep

2

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

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

1

首先递减值,然后打印-

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

要么

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

0

如果您有很多列,并且只想打印最后三个列的所有列,那么这可能会有所帮助

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.