Como remover linhas duplicadas em um arquivo de texto grande com vários GB?

16

Minha pergunta é semelhante a essa pergunta, mas com algumas restrições diferentes:

  • Eu tenho uma grande lista de \npalavras delimitada - uma palavra por linha. O tamanho dos arquivos varia de 2 GB a 10 GB.
  • Preciso remover todas as linhas duplicadas.
  • O processo pode classificar a lista durante o processo de remoção das duplicatas, mas não é obrigatório.
  • Há espaço suficiente na partição para reter a nova lista de palavras exclusiva.

Eu tentei esses dois métodos, mas ambos falham com erros de falta de memória.

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)

Que outras abordagens posso tentar?

bisavô
fonte
Ter um olhar para uma solução usando awk unix.stackexchange.com/a/30178/56820
ezdazuzena

Respostas:

18

Tente usar a classificação com a opção -o/ em --output=FILEvez de redirecionar a saída. Você também pode tentar definir o buffer-sizecom o -S/ --buffer-size=SIZE. Além disso, tente -s/ --stable. E leia a página de manual, ela oferece todas as informações que eu dei.

O comando completo que você pode usar que pode funcionar para o que você está fazendo:

sort -us -o wordlist_unique.lst wordlist.lst

Você também pode querer ler o seguinte URL:

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

Isso explica mais detalhadamente o que a página de manual.

laebshade
fonte
obrigado pela sugestão, infelizmente o uso de --output ainda não corrige o erro de falta de memória. Correr isso ainda me dá sort: write failed: /root/tmp/sortVxscLn: No space left on device. O problema é um pouco irritante, pois não falha imediatamente. Parece que você precisa aguardar que a memória se esgote antes de ocorrer um erro.
Greatwolf
8
@ Victor T .: Esse não é um erro de falta de memória, mas um erro de falta de espaço em disco. O / root está em um sistema de arquivos diferente dos seus dados? Nesse caso, use a opção -T / - directory temporário sortpara usar um sistema de arquivos com mais espaço livre.
Camh
@ camh obrigado que fez o truque. Não sabia que era possível especificar qual buffer intermediário usar.
greatwolf 29/08