ファイル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

答え2

grep -Fこれは、非常に高速な最初のパスを使用してFILE-Bのライン(おそらくFILE-Aの元の100,000ラインよりはるかに少ない)と一致するFILE-Aのラインを出力するために機能します。 awkスクリプトはFILE-Aと比較する行が多くなく、FILE-Aを読み取るときにFILE-Bの行を繰り返すのではなく、FILE-Bを読み取るときにその行を繰り返すことができるため、FILEのみを実行できます。 - FILE-Bの各行に対して一度に1つの出力ファイルを開く/閉じる代わりに、Bの各行に対して一度に1つの出力ファイルを開く/閉じる*一致するFILE-Aの各行について「多くのオープン」の可能性を防ぎます。ファイル「間違い。

$ cat tst.sh
#!/usr/bin/env bash

grep -F -f 'FILE-B' 'FILE-A' |
awk '
    NR==FNR{ lines[++numLines]=$0; next }
    {
        close(out)
        out = $0 ".txt"
        for (i=1; i<=numLines; i++) {
            line = lines[i]
            if (index(line,$0)) {
                print line > out
            }
        }
    }
' - 'FILE-B'

$ ./tst.sh

$ head -100 *.txt
==> 1.txt <==
123
1239870
41967849
910

==> 2.txt <==
123
1239870
2349878
39742366876
2378
6723

==> 23.txt <==
123
1239870
2349878
39742366876
2378
6723

==> 78.txt <==
45678
2349878
41967849
789
2378

関連情報