Grep 计算文件中每个图案在单独文件中出现的次数

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;完成

我正在尝试扫描一个文件(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