计算文件中每个模式出现在单独文件中的次数

时间:2017-01-11 15:54:58

标签: grep pattern-matching

我正在尝试扫描文件(test.txt),如下所示:

make
bake
baker
makes
take
cook
sbake

用于单独文件(ref.txt)中列出的模式:

ake
make
bake
look

我尝试过像grep一样循环:

while read seq; do grep -c "$seq" test.txt; done > out.txt < ref.txt

但是,它不计算部分匹配仅精确匹配(或计算部分匹配时不一致)并输出:

4
1
2
0

而不是

6
2
3
0

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

请参阅why-is-using-a-shell-loop-to-process-text-considered-bad-practice了解一些(但不是全部)不尝试使用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文件中的文本不包含任何正则表达式元字符,或者如果它包含正则表达式匹配。如果它可以,但你需要一个字符串而不是正则表达式匹配,你需要一个稍微不同的解决方案。

答案 1 :(得分:0)

 $ while read -r line; do grep -c $line test.txt ; done < ref.txt
6
2
3
0