다른 큰 파일에 나열된 문자열이 포함된 하나의 큰 파일에서 줄을 삭제하려고 할 때 여전히 문제가 있습니다.
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