tes*_*ter 5 grep awk text-processing regular-expression
我想计算一个非常大的文件中重复模式的数量aa。所以我使用以下命令:
grep -o "aa" ./bwt/dblp.txt | wc -l
Run Code Online (Sandbox Code Playgroud)
这是有效的,除非我有一个字符串,例如aaa,然后它仅将其匹配为 1 个模式。在我的用例中,我需要前 2 as 表示一个模式,但最后 2 as 是第二个模式(这意味着中间的afromaaa可以重复使用)。
我怎样才能实现这个目标?
请注意,该文件非常大,因此如果可能的话,“优化”方式会更好。无论如何,任何可行的解决方案显然都是受欢迎的。
为此,您需要 Perl 正则表达式。使用grep支持该-P标志的 a :
grep -oP '(?<=a)a' file | wc -l
Run Code Online (Sandbox Code Playgroud)
这是一种积极的回顾。a它匹配前面有另一个 的单个a。
如果您愿意perl(或者您grep不支持该-P标志):
perl -ne 'while(m/(?<=a)a/g){$a++}END{print "$a\n"}' file
Run Code Online (Sandbox Code Playgroud)
例子:
$ cat file
aa
aaa
aaaa
Run Code Online (Sandbox Code Playgroud)
第一行应该是 1 个匹配,第二行应该是两个,第三行应该是一棵树;总共6:
$ grep -oP '(?<=a)a' file | wc -l
6
Run Code Online (Sandbox Code Playgroud)