Remover linhas duplicadas de um arquivo de texto muito grande [duplicado]

2

Eu tenho um arquivo de texto muito grande (> 50 GB), mas a maioria das linhas são duplicadas, portanto, quero removê-las. Existe alguma maneira de remover linhas duplicadas de um arquivo e manipular arquivos > 2GB? Porque todo método que encontrei até agora só funciona em arquivos pequenos.

    
por Muis 25.11.2013 / 13:28

2 respostas

4

Assumindo que todas as linhas sejam menores que 7kB e que você tenha o bash, o dd, o tail, o head, o sed e o sort instalados a partir do cygwin / unix:

{
  i=0
  while LANG= dd 2>/dev/null bs=1024 skip=${i}000 if=large_text_file count=1021 \
  | LANG= sed -e '1d' -e '$d'  | LANG= sort -u ;
  do
    i=$((1+$i))
  done
  LANG= dd 2>/dev/null bs=1024 skip=${i}000 if=large_text_file count=1021 \
  | LANG= tail -n 1
  LANG= head -n 1 large_text_file
} | LANG= sort -u > your_result

Isso divide o arquivo em partes de 1024000 bytes e adiciona também 3 * 7 * 1024 bytes ("21" em 1021 ) do próximo bloco. Como as divisões podem cortar uma linha, primeiro ( 1d ) e última ( $d ) linhas de cada trecho são destruídas ( sed ).

Então, para compensar, algo contendo o último pedaço é extraído novamente e apenas sua última linha é mantida (tail -n 1), e a primeira linha também é extraída novamente (head -n 1).

Quando o loop falha, o último fragmento foi extraído.

sort -u pode ser visto como um compressor, mas apenas ordena sua entrada e pula duplicatas. O primeiro "sort" comprime todos os pedaços. O segundo sort comprime novamente as concatenações de todos esses trechos (e esse segundo sort está faltando no código acima desde a terceira edição, desculpe).

Você disse que o arquivo de texto, mas eu assumo binário de qualquer maneira, daí o LANG= (fica tudo mais rápido também).

    
por 25.11.2013 / 14:04
0

Inicialize uma instância do Linux no AWS / GCE e use o 'uniq'. OSX também tem ...

Docs aqui: link

    
por 25.11.2013 / 16:42