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

Posted

技术标签:

【中文标题】在`awk`中打印倒数第二列/字段【英文标题】:Print second-to-last column/field in `awk` 【发布时间】:2011-01-06 23:28:27 【问题描述】:

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

这似乎不起作用:

awk '  print ( $NF-- )   '

【问题讨论】:

NF是最后一个字段的索引,$NF是最后一个字段的值 现在说得通了。这就是为什么括号外的美元我认为有效的原因 【参考方案1】:

先递减值再打印-

awk '  print $(--NF)' file

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

使用以下命令行选项:

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

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

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

e执行perl代码

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

【讨论】:

或者使用perl已经提供的负索引...$F[-2]【参考方案4】:

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

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

【讨论】:

【参考方案5】:

最简单的:

 awk 'print $--NF' 

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

【讨论】:

作为助记词,此行为与C/Java等相同。int x = ++iint x = i++,前缀表示先递增;后缀表示以后递增(先赋值)。【参考方案6】:

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

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

【讨论】:

【参考方案7】:
awk '  print ( $(NF-1) ) ' file

【讨论】:

【参考方案8】:
awk 'print $(NF-1)'

应该工作

【讨论】:

这对我不起作用。我在 Ubuntu 下的 awk 3.1.8 中得到“title:5: command not found: NF-1”。 我会避免前/后递减,以确保您不会更改 $NF 的值 如果您尝试获取倒数第三个字段,例如awk -F '.' 'print $(NF-2)',则会中断 @Gurgeh:这是因为$(..) 根据您使用的shell 在子shell 中调用命令。您可以使用$ (NF-1) 而不是$(NF-1) 来解决此问题。【参考方案9】:

对 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`中打印倒数第二列/字段的主要内容,如果未能解决你的问题,请参考以下文章

awk打印某列之后的所有列

awk

linux--awk

awk

awk的基本使用

如何使用awk有条件地附加字段的出现?