私は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 file2
file1
大容量ファイルでも問題ありませんgrep -vf file1 file2
ファイルサイズが大きくなると深刻な問題が発生しますfile1
(サイズが500行または4 KBを超える場合にのみ表示されます)。
答え2
はい、大丈夫でしょう。最悪のシナリオは、除外する文字列を含むファイルが処理中のファイルのサイズと等しく、メモリに収まらないことです。このような状況が発生した場合は、除外ファイルをチャンクに分割して複数回実行します。