尝试删除一个大文件中包含另一个大文件中列出的字符串的行时仍然遇到问题。
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]
它适用于排序文件和非常大的文件 - 但它仅适用于删除重复行 - 不适用于删除包含字符串的行。
我对两个大文件进行了排序,以便我正在搜索的字符串位于每一行的开头:
文本文件:
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