首页 文章

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

提问于
浏览
145

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

这似乎不起作用:

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

9 回答

  • 239
    awk '{print $(NF-1)}'
    

    应该管用

  • 4

    克里斯·坎农(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) ) }'
    )
    
  • 20

    这是最简单的:

    awk '{print $--NF}'
    

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

  • 0
    awk ' { print ( $(NF-1) ) }' file
    
  • 3

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

    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
    
  • 2

    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 中元素的数量

  • 9

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

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

    如果你有很多列,想要打印最后一个但不是三个cloumns,那么这可能会有所帮助

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

  • 12

    首先递减值然后打印 -

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

    要么

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

相关问题