
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