ファイル内のパターンに 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 で実行して重複を削除し、次にパターンに使用します。

それを新しいファイルにフィルタリングするか、ファイルを行ごとに処理してそこから実行することができます。

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

関連情報