我想用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
但我不知道如何在最后一次出现时这样做。
答案 0 :(得分:9)
cat -n textfile.txt | grep " b " | tail -1 | cut -f 1
cat -n
将文件打印到STDOUT前缀行号。grep
将所有包含“b”的行打开(你可以使用egrep获取更高级的模式,或者使用fgrep获得更快的固定字符串grep)tail -1
打印包含“b”cut -f 1
打印第一列,即cat -n
或者如果你愿意,你可以使用Perl(这与你在awk中所做的非常相似,但坦率地说,如果我有Perl方便,我个人不会使用awk - Perl支持awk可以做的100% ,按设计,作为1-liners - YMMV):
perl -ne '{$n=$. if / b /} END {print "$n\n"}' textfile.txt
答案 1 :(得分: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 advise更新:
$ awk '{if ($2=="b") a=NR} END{print a}' your_file
避免在第二个字段中有一些abc
。
它也是有效的(更短的,我保留上面的那个,因为它是我认为的那个:D):
$ awk '$2=="b" {a=NR} END{print a}' your_file
答案 2 :(得分: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