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

在“awk”中打印倒数第二列/字段`,awk,Awk,我想打印awk中倒数第二列或字段。字段数是NF变量。我知道我应该能够使用$NF,但我不确定如何使用它 这似乎不起作用: awk ' { print ( $NF-- ) } ' 应该可以对Chris Kannon接受的答案进行小的补充:只有在有第二列的情况下才打印 awk ' { print ( $(NF-1) ) }' file ( echo | awk 'NF && NF-1 { print ( $(NF-1) ) }' echo 1 | awk 'N

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

这似乎不起作用:

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

应该可以

对Chris Kannon接受的答案进行小的补充:只有在有第二列的情况下才打印

awk ' { print ( $(NF-1) ) }' file
(
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 '{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
这是最简单的:

 awk '{print $--NF}' 

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

如果您有许多列,并且希望在最后一列中打印所有列,但不打印三个克隆,那么这可能会有所帮助


awk'{$NF=“”;$(NF-1)=“;$(NF-2)=“;print$0}”的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

中的元素数您是否尝试使用rev命令从右向左启动? 在这种情况下,您只需打印第二列:

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

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

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


NF
是最后一个字段索引,
$NF
是现在有意义的最后一个字段的值。这就是为什么括号外的美元起作用,我想这对我不起作用。我在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)
来解决这个问题。或者使用perl已经提供的负索引
$F[-2]
作为助记符,此行为与C/Java等类似。
int x=++i
int x=i++
,前缀表示先递增;后缀表示以后递增(先赋值)。
awk ' { print $(--NF)}' file
rev file|cut -d ' ' -f2|rev