如何使用 grep 处理文件中的模式并获取每个模式出现的次数?

如何使用 grep 处理文件中的模式并获取每个模式出现的次数?

我试图弄清楚如何将 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

相关内容