【问题标题】:Can't do operation with awk command [duplicate]无法使用 awk 命令进行操作 [重复]
【发布时间】:2023-03-04 10:22:01
【问题描述】:

如果输入每次都是可变的,我们必须做什么,并且基于该输入,我们必须再次对第一个命令的输出进行另一次操作。请参考下面的例子。

假设我在终端上执行了 x 命令,它给我的输出如下(空格分隔):

abc efg hij klm nop qrs uvw
abc efg hij klm qrs uvw

有时有 6 列,有时有 5 列。

我将此输出传递给 awk 命令以打印第 6 列,即qrs,它在第一种情况下返回正确的结果,但在第二种情况下显示uvw

【问题讨论】:

  • 向我们展示您发布的 awk 命令(嗯,请尽量少)
  • 情况 2 的预期输出是什么?您的 awk 命令实际上应该做什么?看起来工作正常,在这两种情况下它都会打印第 6 列:案例 1 中的“qrs”和案例 2 中的 uvw 实际上都是第 6 个字段。
  • ->echo "abc efg hij klm nop qrs uvw" | awk '{ print $6}' qrs ->echo "abc efg hij klm qrs uvw" | awk '{ print $6}' uvw
  • 是的,它就是这么做的。 uvwcase 2 中的第 6 列,这是预期的。
  • @navnathbagade 你还没有说明如何识别你想要的“qrs”。是倒数第二列还是其他?即如果命令给出不同数量的列作为输出,你如何识别你想要的列?

标签: shell awk


【解决方案1】:

如果你想要最后一列,那么你可以使用NF 变量:

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

【讨论】:

  • @ikrabbe Blue Moon 提到他要打印倒数第二列,所以解决方案与此一致。
  • 是的,我已经删除了我的评论。但我不知道 Op 是否真的想打印倒数第二列。 $(NF-1) 也会在空行上中断。
  • @ikrabbe 这就是我根据给出的示例所想的。必须有某种模式(最后一列,或倒数第三列等)来唯一标识所需的列。否则,怎么会有人知道要提取什么?如果不是这样,OP应该澄清它。
  • @BlueMoon 一切正常,我对您的解决方案没有意见,但我更喜欢我的回答;)
【解决方案2】:

查看这个 awk 和输出!

awk '{print NF, $NF, $6}' <<EOF
abc efg hij klm nop qrs uvw
abc efg hij klm qrs uvw
EOF

awk 从 1 开始计数,所以一切都是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    相关资源
    最近更新 更多