【问题标题】:linux command to get the last appearance of a string in a text filelinux命令获取文本文件中字符串的最后一次出现
【发布时间】:2013-05-01 11:52:47
【问题描述】:

我想使用 linux 命令在文本文件中查找字符串的最后一次出现。例如

1 a 1
2 a 2
3 a 3
1 b 1
2 b 2
3 b 3
1 c 1
2 c 2
3 c 3

在这样的文本文件中,我想找到 b 最后出现的行号,即 6。 我可以用

找到第一个外观
awk '/ b / {print NR;exit}' textFile.txt

但我不知道如何在最后一次出现时做到这一点。

【问题讨论】:

    标签: linux awk command text-files


    【解决方案1】:
    cat -n textfile.txt | grep " b " | tail -1 |  cut -f 1
    
    • cat -n 将文件打印到 STDOUT 前面的行号。
    • grep grep 出所有包含“b”的行(您可以使用 egrep 获得更高级的模式,或者使用 fgrep 更快地 grep 固定字符串)
    • tail -1 打印包含“b”的行的最后一行
    • cut -f 1 打印第一列,即来自 cat -n 的第 # 行

    如果你愿意,你也可以使用 Perl(这与你在 awk 中所做的非常相似,但坦率地说,如果我手边有 Perl,我个人不会使用 awk - Perl 支持 100% 的 awk 可以做的事情,按照设计,作为 1 行 - YMMV):

    perl -ne '{$n=$. if / b /} END {print "$n\n"}' textfile.txt 
    

    【讨论】:

    • @downvoter 所有答案都旨在提供帮助。如果某些答案不起作用,您可以发表评论并帮助修复。我认为任何答案都不值得反对,尤其是一个可行的答案。只需 +1 即可均衡。
    • 我无法理解这样的反对意见。让我们 +1 另一个,这是一个很好的答案。
    • 投票可能很有趣,我会为 perl 提供 +1,但为管道提供 -1,因此整体 +0,但有趣的是,单个不赞成票被视为来自不会给予这些投票的用户的 2 个赞成票起初。这几乎抵消了投票的任何意义(无论是向上还是向下)。有趣的是,您不认为@fedorqui 的回答值得一票,但是在肯特只赞成他的回答的地方很快就会抱怨?您甚至自己说 OP 对您的解决方案很满意,所以为什么要抱怨 +1,尤其是当您拥有超过 50K 的代表时。
    • 我没有投反对票,但管道中的 N 个工具是错误的方法(UNIX 不是在一个命令就可以使用管道中的小命令链!)所以我不会感到惊讶的是,这被否决了。至于 perl 做所有 awk 可以做的事情 - 是的,但它并不总是存在,而且发布的 perl 解决方案通常是不必要的神秘。
    • @sudo_O - 大声笑,坦率地说,我不赞成另一个答案只是担心如果你将我的答案是 DVed 和我对他的答案的 UV 结合起来,从选票来看,我的答案看起来明显逊色。我尽量避免一般的战术投票,但这个 DV 让我比平时更不理性。
    【解决方案2】:

    这可以工作:

    $ awk '{if ($2~"b") a=NR} END{print a}' your_file
    

    我们检查每个第二个文件是否为“b”并记录行数。它是附加的,所以当我们读完文件时,它将是最后一个。

    测试:

    $ awk '{if ($2~"b") a=NR} END{print a}' your_file
    6
    

    根据sudo_O advise更新:

    $ awk '{if ($2=="b") a=NR} END{print a}' your_file
    

    避免在第二个字段中有一些abc

    这个也是有效的(更短,我保留上面的那个,因为它是我认为的那个:D):

    $ awk '$2=="b" {a=NR} END{print a}' your_file
    

    【讨论】:

    • @DVK。 :) 好的,我的意见:1)你也使用了 awk(在你编辑之前),但是你有 cat, grep, tail and awk 他们不是必需的。没关系。 2)你grep b,适用于op的例子。但是如果你看一下OP的代码:/ b /,他只是想匹配中间部分(我的理解)grep b是一种大规模的杀戮。
    • 嗯,这取决于每个人都觉得使用哪种语言更舒服。对我来说,awk 非常强大且易于更新:小代码可以做很多事情。我猜或多或少像 perl。我也不喜欢管道很多命令,例如,从你的回答中,我更喜欢perl 部分而不是cat | grep | tail | cut 一个,也因为它必须匹配第二个字段中的“b”。
    • @fedorqui 条件应该在块之外,在我看来,字符串比较在这里更合适,这将避免误报,例如abcawk '$2=="b"{n=NR} END{print n}' file
    • @fedorqui 因为这是 awk 的语法,condition{block} 如果条件为真,则执行块。当然,您的原始代码还可以,但这是awk 方式!
    • @DVK 将您的问题写在...why pay the cost of re-writing awk to Perl later 上面-您没有。 awk 是专为文本处理而创建的工具,因此任何文本处理工作都可以在其中清晰简洁地完成,随着工作变得越来越大,您无需更改为其他工具/语言。如果您的工作不是文本处理,那么您不应该使用 awk - 使用 shell 或 ruby​​ 或 perl 或其他。我使用 UNIX 已经 31 年了,除了 YMMV 之外,还没有找到 perl 的用途。
    【解决方案3】:

    如果 $2 总是分组的另一种方法(可能比等到最后更有效):

    awk 'NR==1||$2=="b",$2=="b"{next} {print NR-1; exit}' file
    

    awk '$2=="b"{f=1} f==1 && $2!="b" {print NR-1; exit}' file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 2014-12-02
      • 2021-08-22
      • 1970-01-01
      • 1970-01-01
      • 2016-02-14
      相关资源
      最近更新 更多