【问题标题】:How to print all lines matching the first field of last line如何打印与最后一行的第一个字段匹配的所有行
【发布时间】:2023-03-07 07:42:01
【问题描述】:

过去两天我一直在尝试这样做。我阅读了很多教程,学到了很多新东西,但到目前为止,我无法实现我想要做的事情。假设这是命令行输出:

Johnny123   US  224
Johnny123   US  145
Johnny123   US  555
Johnny123   US  344
Robert  UK  4322
Robert  UK  52
Lucas   FR  344
Lucas   FR  222
Lucas   FR  8945

我想打印匹配“最后一行的第一个字段(卢卡斯)”的行。

所以,我想打印出来:

Lucas   FR  344
Lucas   FR  222
Lucas   FR  8945

注意事项:

  • 我尝试打印的内容每次都有不同的行数,因此我无法执行仅返回最后 3 行之类的操作。
  • 第一个字段没有可用于打印的特定模式。

【问题讨论】:

    标签: regex shell command-line awk sed


    【解决方案1】:
    awk 'NR==FNR{key=$1;next} $1==key' file file
    

    或者如果你喜欢

    awk '{val[$1]=val[$1] $0 RS; key=$1} END{printf "%s", val[key]}' file
    

    【讨论】:

    • 嗨,埃德。我记得您的回答是我收到的第一个有效答案。对此感激不尽。顺便说一句,您的第一个代码不会打印任何内容,但第二个代码可以正常工作。此外,正如我在回答 jaypal 时所问的那样,此代码将用于在线工具中,因此会大量运行。性能方面,哪个效率更高?你的代码还是 jaypal 的 asnwer?
    • 您是否注意到文件名在第一个脚本的命令行中被指定了两次? wrt 性能 - 对于任何合理大小的文件,它们都会在眨眼之间运行,因此只需选择您将来支持、维护和增强的任何一个。
    • 我明白了。感谢您的回复埃德。我没有在文件上运行它。我直接在命令行的输出上运行它。所以我认为这就是为什么它现在对我不起作用。
    • 对,第一个版本不能在管道输入上运行。
    【解决方案2】:

    这是使用tacawk 的另一种方式:

    tac file | awk 'NR==1{last=$1}$1==last' | tac
    Lucas   FR  344
    Lucas   FR  222
    Lucas   FR  8945
    

    最后一个tac 仅在订单很重要时才需要。

    【讨论】:

    • 太棒了。有用。您能否向我解释一下“{last=$1}$1==last”部分。我搜索了“NR==1”,现在我明白这意味着一条记录,但其余代码呢?我只是想了解一下,如果遇到其他可以使用 awk 解决的问题。
    • @Sameh 不客气。当然,last 只是一个变量,当它是第一行时,我们将第一列的值分配给它(请记住,tac 已经为我们反转了文件)。 $1==last 是一个测试条件。如果为真,我们将打印该行。
    • 太棒了!太感谢了。最后一件事,此代码将在在线工具中使用,因此它会运行很多。性能方面,哪个效率更高?你的答案还是 Ed Morton 的答案?
    • @Sameh 您可以使用带有time 命令的生产文件之一运行这两个命令(只需将time 放在上面显示的命令time tac file ... 前面)并查看性能。我的猜测是两者都应该花费相当多的时间。 tac 可能会快一点,因为它是一个用于反转文件的C 实用程序,但我可能会偏向于我的答案。 :).
    【解决方案3】:

    这可能对你有用(GNU sed):

    sed -nr 'H;g;/^(\S+\s).*\n\1[^\n]*$/!{s/.*\n//;h};$p' file
    

    在保持空间中存储具有重复键的行。在更改密钥时删除以前的行。在文件末尾打印出剩余的内容。

    【讨论】:

    • 这也有效:D。我在哪里可以了解复杂的 sed 命令(like this)?
    • @AvinashRaj 将鼠标悬停在sed 标签上并选择info
    • 该信息页面中有很多链接。请为我推荐一个清楚描述 sed 循环、保持空间、模式空间、标签的内容。
    • @EdMorton 是的,我同意你的看法。请推荐关于数组、循环的 awk 教程。
    • @AvinashRaj 只需获取 Arnold Robbins(gawk 的提供者)的《Effective Awk Programming, Third Edition》一书。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 2019-04-29
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 2018-03-25
    相关资源
    最近更新 更多