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