ファイルBの用語を使用してファイルAを検索し、ファイルBの検索用語に基づいて個々のTXTファイルに出力を保存します。

ファイルBの用語を使用してファイルAを検索し、ファイルBの検索用語に基づいて個々のTXTファイルに出力を保存します。

FILE-Aには100,000行があります。 FILE-Bは50の検索語です。 FILE-B(CSVまたはTXT)のさまざまな用語を使用してFILE-A(CSVまたはTXT)検索を完了します - ここにコアがあります。 - FILE-B用語検索に基づいて別々のTXTファイルに結果を保存したい。の。

例:

ファイル-A

123
45678
1239870
2349878
39742366876
41967849
789
910
2378
6723

ファイル-B

1
2
23
78

結果 = 「1.txt」にはFILE-Aで一致するすべての行が含まれ、「2.txt」にはFILE-Aで一致するすべての行が含まれ、「23.txt」、「78.txt」などが含まれます。したがって、FILE-Bに50個の検索語がある場合、FILE-Aにその用語に一致するファイルが1つ以上あると仮定すると、検索語に名前が付けられた50個のTXTファイルが生成されます。

FILE-A で見つかった FILE-B のすべての検索語を 1 つの「output.txt」の中間に入れる「fgrep -f FILE-B.txt FILE-A.csv>>output.txt」を使って検索します。代わりに別のテキストファイルに分割したいと思います。

ベストアンサー1

Grep+Xargs

xargs -d '\n' sh -c '
    for term; do grep "$term" fileA > "$term.txt"; done
' xargs-sh < fileB

で改善されましたカス

Grep+ シェル

一般的に言えばシェルを使ってファイルを繰り返すのは悪い習慣です。しかし、ここではfileBそれよりはるかに小さいfileAので、パフォーマンスに大きな影響はありません。

while IFS= read -r term; do
    grep "$term" fileA > "$term.txt"
done < fileB

アッ

awk 'NR==FNR{pat[$0];next}{for(term in pat){if($0~term){print>term}}}' fileB fileA
  • NR==FNR{pat[$0];next}引数として指定された最初のファイルを読み、各行を配列に入れますpat
  • {for(term in pat){if($0~term){print>term}}}説明が必要です。term配列の各要素について、現在の行がその用語と一致するかどうかをテストし、一致する場合は、適切な名前のファイルに印刷します。

すべてのAwkが同時に複数のファイルを開くことができるわけではありません。この問題を解決する1つの方法は提案することです。エドモートンclose、ステートメントを使用し、追加の演算子を使用します。

awk 'NR==FNR{pat[$0];next}{for(term in pat){if($0~term){print>>term;close(term)}}}' fileB fileA

おすすめ記事