別のLARGEファイルにリストされている文字列を含むLARGEファイルの行を削除しようとしても問題が発生します。
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
ありがとう。
_$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
これで、file.txtという名前のファイルが/ tmpにたくさんあるので、次のようにします。
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