我正在尝试扫描文件(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
感谢您的帮助!
答案 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