文字列(他のテキストファイルにリストされている)を含む行を削除する最も高速で効率的な方法

文字列(他のテキストファイルにリストされている)を含む行を削除する最も高速で効率的な方法

私はfgrepが他のファイル(file2)の文字列を含むファイル(file1)から行を削除する最も高速で効率的な方法かどうか疑問に思います。

私はfgrep関数が次のようにこれを行う必要があることを発見しました。

  fgrep -v -f file1  file2  > file_with_lines_containing_search_strings_removed

これが非常に大きなファイルで動作するかどうかわかりません。

100,000行を含む2つのファイルがあるので、できるだけ早い方法を使いたいです。

ありがとうございます。

7月4日を楽しんでください。笑わせたアメリカ人の皆さん。

答え1

「別のファイルで見つかった文字列を含む行」(「他のファイルのregExpに一致する文字列を含む行」の代わりに)を希望する場合は、次のことを試してください。

grep -vFf file1 file2 > file3

"grep -F"は正規表現の一致ではなく、単純な文字列の一致(はるかに早く)

またはより良い

grep -vwFf file1 file2                 #respect word boundary

簡単な時間比較テスト:

1)100,000本のランダムラインでサンプルファイルを作成する2

seq 1000000 | shuf -n 100000 > file2

2)任意の10,000行(削除する文字列)でサンプルファイル1を設定します。

 seq 1000000 | shuf -n 10000 > file1

31)使用grep -F ---time grep -vwFf file1 file2 > file31

real    0m0.111s
user    0m0.100s
sys 0m0.008s

32)-Fいいえ——time grep -vwf file1 file2 > file32

...時間!

if file1 has just 300 lines --    0.327s          very fast
....              600 lines --    8.326s
....              900 lines --   35.334s
....             1200 lines -- 1m31.433s      (quadratic with file1 len?)

....            10000 lines -- it is still calculating (several hours?)
UPDATED                     1h03m53.983s

テスト結論:

  • grep -vFf file1 file2比較するgrep -vf

  • grep -vFf file1 file2file1大容量ファイルでも問題ありません

  • grep -vf file1 file2ファイルサイズが大きくなると深刻な問題が発生しますfile1(サイズが500行または4 KBを超える場合にのみ表示されます)。

答え2

はい、大丈夫でしょう。最悪のシナリオは、除外する文字列を含むファイルが処理中のファイルのサイズと等しく、メモリに収まらないことです。このような状況が発生した場合は、除外ファイルをチャンクに分割して複数回実行します。

関連情報