Grep 计算文件中每个图案在单独文件中出现的次数
我正在尝试扫描一个文件(test.txt),如下所示:Grep 计算文件中每个图案在单独文件中出现的次数,grep,pattern-matching,Grep,Pattern Matching,我正在尝试扫描一个文件(test.txt),如下所示: make bake baker makes take cook sbake 对于单独文件(ref.txt)中列出的模式: 我尝试过与grep进行循环,如下所示: while read seq; do grep -c "$seq" test.txt; done > out.txt < ref.txt 而不是 6 2 3 0 谢谢你的帮助 $whileread-r行;dogrep-c$line test.txt;完成
make
bake
baker
makes
take
cook
sbake
对于单独文件(ref.txt)中列出的模式:
我尝试过与grep进行循环,如下所示:
while read seq; do grep -c "$seq" test.txt; done > out.txt < ref.txt
而不是
6
2
3
0
谢谢你的帮助 $whileread-r行;dogrep-c$line test.txt;完成 $ while read -r line; do grep -c $line test.txt ; done < ref.txt
6
2
3
0
6.
2.
3.
0
有关不尝试使用shell循环执行此操作的部分(但不是全部)原因,请参阅
用于操作文本的标准UNIX工具是awk:
$ awk 'NR==FNR{cnt[$0]=0;next} {for (re in cnt) cnt[re]+=gsub(re,"&")} END{for (re in cnt) print re, cnt[re]}' ref.txt test.txt
ake 6
bake 3
look 0
make 2
上面假设ref.txt文件中的文本不包含任何regexp元字符,或者如果包含任何regexp元字符,则需要与regexp匹配。如果可以,但是您需要一个字符串而不是regexp匹配,那么您需要一个稍微不同的解决方案。对不起,上面编辑过,所以现在应该是正确的。我无法复制此内容。对我来说,它正确地返回了6 2 3 0。同样的,不能在
grep(GNU grep)2.26上复制。谢谢,看起来我使用的grep肯定有问题,我会尝试一种不同的方法,而不使用grepIt。你的输入文件很可能包含跟踪控件Ms(因此,ake^M
无法与bake^M
匹配,因为bake
和r^M
之间没有^M
),因此您的grep被破坏。cat-v文件
将显示控件Ms,然后尝试在输入文件上运行dos2unix或类似程序,然后重试解决方案。
$ while read -r line; do grep -c $line test.txt ; done < ref.txt
6
2
3
0
$ awk 'NR==FNR{cnt[$0]=0;next} {for (re in cnt) cnt[re]+=gsub(re,"&")} END{for (re in cnt) print re, cnt[re]}' ref.txt test.txt
ake 6
bake 3
look 0
make 2