別の大きなファイルにリストされている文字列を含む1つの大きなファイルから行を削除しようとすると、まだ問題があります。
grep -vwFf file1 file2 - FAILS due to memory exhaustion.
私は以下を使用しました:
comm -23 file1 file2
[https://stackoverflow.com/questions/4366533/remove-lines-from-file-which-appear-in-another-file][1]
ソートされたファイルと非常に大きなファイルに対して機能しますが、文字列を含む行を削除するのではなく、重複した行を削除する場合にのみ機能します。
私が探している文字列が各行の先頭にあるように、2つの大きなファイルを並べ替えました。
テキストファイル:
AAAAA blah blah blah
AAAAB blas blas blas
CCCCC sdf sf sdf
文字列ファイル
AAAAA
CCCCC
ありがとうございます。
答え1
$file1
複数の小さなファイル(/ tmpまたはmktempを使用)をバーストしてから、各ファイルを繰り返して$file1
grepするのはどうですか?パターン$file1
ファイル()の理想的なサイズはシステムによって異なります。
ここでは各行$file1
に 1000 行があります。
i=1 while [ $i -lt $count ] do sed -n "$i,$(($i +1000))p" file1.txt >> /tmp/file${1}.txt i=$(( $i + 1001)) done
これで、/ tmpにfile.txtというファイルがたくさんあるので、次のことができます。
for file1 in $(ls /tmp/file*.txt) do grep -vwFf $file1 file2 done
mktempを使用する方が安全です。
TEMP_DIR=$(mktemp)
for file1 in $(ls ${TEMP_DIR}/file*.txt) do grep -vwFf $file1 file2 done