큰 멀티 GB 텍스트 파일에서 중복 줄을 제거하는 방법은 무엇입니까?


16

내 질문은 이 질문 과 비슷 하지만 몇 가지 다른 제약 조건이 있습니다.

  • \n한 줄에 하나씩 큰 단어 목록이 있습니다. 파일 크기는 2GB에서 10GB까지입니다.
  • 중복 줄을 제거해야합니다.
  • 프로세스는 중복을 제거하는 과정에서 목록을 정렬 할 수 있지만 필수는 아닙니다.
  • 새로운 고유 한 단어 목록을 출력하기에 충분한 공간이 파티션에 있습니다.

이 두 가지 방법을 모두 시도했지만 메모리 부족 오류로 실패합니다.

sort -u wordlist.lst > wordlist_unique.lst
awk '!seen[$0]++' wordlist.lst > wordlist_unique.lst
awk: (FILENAME=wordlist.lst FNR=43601815) fatal: assoc_lookup: bucket-ahname_str: can't allocate 10 bytes of memory (Cannot allocate memory)

다른 어떤 접근법을 시도 할 수 있습니까?


답변:


18

출력을 재지 정하는 대신 -o/ --output=FILE옵션 과 함께 sort를 사용하십시오 . 또한 설정을 시도 할 수 buffer-size-S/ --buffer-size=SIZE. 또한 -s/을 시도하십시오 --stable. 맨 페이지를 읽으면 내가 준 모든 정보를 제공합니다.

사용할 수있는 전체 명령은 수행중인 작업에 효과적 일 수 있습니다.

sort -us -o wordlist_unique.lst wordlist.lst

다음 URL을 읽을 수도 있습니다.

http://www.gnu.org/s/coreutils/manual/html_node/sort-invocation.html

그것은 맨 페이지보다 정렬을 더 철저하게 설명합니다.


안타깝게도 --output을 사용해도 여전히 메모리 부족 오류를 수정하지는 않습니다. 그 실행은 여전히 ​​나에게 준다 sort: write failed: /root/tmp/sortVxscLn: No space left on device. 문제는 바로 실패하지 않는다는 점에서 약간 성가시다. 오류가 발생하기 전에 메모리가 소진 될 때까지 기다려야하는 것 같습니다.
greatwolf

8
@Victor T .: 메모리 부족 오류가 아니라 디스크 공간 부족 오류입니다. / root가 데이터와 다른 파일 시스템에 있습니까? 그렇다면, -T /-temporary-directory 옵션 sort을 사용하여 여유 공간이 더 많은 파일 시스템을 사용하십시오.
camh

@camh 감사합니다. 사용할 중간 버퍼를 지정할 수 있다는 것을 몰랐습니다.
큰 늑대
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.