我试图弄清楚如何将 grep 与 fileA.txt 中的模式一起使用,并在 fileB.tab 中查找它们。我想要的结果是 fileB.tab 中每个模式的出现次数。
我努力了:
grep -f FileA.txt FileB.tab | wc -l
但我认为这让我返回了 FileB.tab 中出现 fileA.tab 模式的所有行。
答案1
如果patterns
文件仅包含固定字符串,则在gnu
设置中您可以执行以下操作
grep -oFf patterns infile | sort | uniq -c
如果内容是正则表达式那么可能是这样的
sed -E 'h;s|/|\\&|g;x;s|[\&/]|\\&|g;H;x;s|(.*)\n(.*)|s/\1/\2/|' patterns \
| sed -f - <(grep -of patterns infile) | sort | uniq -c
即grep
仅这次使用相同的命令处理结果,sed
以便将匹配项替换为实际模式(通过sed
基于 内容的另一个脚本patterns
)
答案2
uniq 有一个选项来计算出现次数
grep -f fileA.txt fileB.txt | uniq -c
但请记住,如果 fileA 中有重复项,计数将不正确,因为它会多次 grep 查找它们。在这种情况下,首先通过 uniq 运行 fileA 以删除重复项,然后将其用于模式。
您可以将其过滤到一个新文件中,或者逐行处理该文件并从中运行。
while read keyword; do grep $keyword fileB.txt; done < fileA.txt | uniq -c