grep -v -f 대안

grep -v -f 대안

두 개의 파일이 있습니다. 파일 1에서 파일 2의 모든 내용을 제외하고 싶습니다.

예)

파일 #1 - 500개 도메인 이름 목록

domain1
domain2
domain3
etc..

파일 #2 - Alexa의 상위 1,000,000개 도메인

domain1
domain2
domain3
etc..

나는 이것이 효과가 있을 것이라고 생각한다.

cat file1 | grep -v -f file2 > results

이는 file2에서 10k+를 초과하는 모든 것에 대해 항상 "killed"를 초래합니다.

/var/log/messages메모리가 부족하다고 표시됩니다. 상자에는 12GB RAM이 있습니다.

Aug 25 02:21:18 V-RHEL-EM kernel: Out of memory: Kill process 13779 (grep) score 860 or sacrifice child
Aug 25 02:21:18 V-RHEL-EM kernel: Killed process 13779 (grep), UID 0, total-vm:9377064kB, anon-rss:7400368kB, file-rss:0kB, shmem-rss:0kB

더 좋은 방법이 있나요?

답변1

고정 문자열을 사용하고 있으므로 해당 -F플래그를 추가하고 전체 행을 일치시키려면 해당 -x플래그를 추가하십시오. 여기서는 필요하지 않으며 cat파일 grep매개변수와 함께 사용할 수 있습니다.

grep -F -x -v -f file2 file1 > results


file2여러 부분 으로 분할하고 N, grep각 부분에서 실행하고, 결과를 다음 실행을 위한 입력 파일로 사용할 수 있습니다.

# split file2 into N=4 parts file2.00 file2.01 file2.02 file2.03
split -nl/4 -d file2 file2.

# use results as input file
cp file1 results

for f2 in file2.??; do
        grep -F -x -v -f "$f2" results > rtemp && mv rtemp results
done

# cleanup
rm file2.??

N=4필요에 따라 조정하십시오.

관련 정보