4

我想使用 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

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

4

3 回答 3

9
cat -n textfile.txt | grep " b " | tail -1 |  cut -f 1
  • cat -n将文件打印到 STDOUT 前面的行号。
  • grepgrep 出所有包含“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 
于 2013-05-07T13:40:35.910 回答
3

这可以工作:

$ 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 建议更新:

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

避免abc在第二个领域有一些。

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

$ awk '$2=="b" {a=NR} END{print a}' your_file
于 2013-05-07T13:42:37.353 回答
0

如果 $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
于 2013-05-07T18:52:03.910 回答