grepを使用してファイルのパターンを処理し、各パターンの発生回数を取得するにはどうすればよいですか?

grepを使用してファイルのパターンを処理し、各パターンの発生回数を取得するにはどうすればよいですか?

fileA.txtのパターンでgrepを使用し、fileB.tabで検索する方法を見つけようとしています。私が望む結果は、fileB.tabの各パターンが発生した回数です。

私は試した:

grep -f FileA.txt FileB.tab | wc -l

しかし、これはfileA.tabパターンが発生するFileB.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を実行するため、カウントが正しくありません。この場合、fileAは最初にuniqを介して実行され、重複したエントリを削除してからパターンに使用されます。

新しいファイルでフィルタリングしたり、ファイルを1行ずつ処理したり、そこで実行したりできます。

while read keyword; do grep $keyword fileB.txt; done < fileA.txt | uniq -c

関連情報