我想使用 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 命令在文本文件中查找字符串的最后一次出现。例如
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
但我不知道如何在最后一次发生时做到这一点。
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
这可以工作:
$ 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
如果 $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