Como remover linhas de texto duplicadas de arquivos maiores que 4 GB?

5

Estou à procura de um editor de texto de janelas de código-fonte aberto (possivelmente de 64 bits) que me permita remover linhas duplicadas de um arquivo de texto extremamente grande (4 GB +).

O que você usa para remover linhas duplicadas de seus arquivos de texto grandes?

    
por darkAsPitch 08.12.2010 / 21:09

5 respostas

4

sort -u file > outfile

Uma útil porta nativa do Win32 de sort está em UnxUtils

Para significados mais complicados de "remover duplicatas", há Perl (et al).

    
por 08.12.2010 / 22:33
2

Se você tem o Cygwin ou o MinGW, você provavelmente poderia fazer isso com

cat file | sort | uniq >> outfile

assumindo que você deseja linhas exclusivas. Não sei como isso funcionará, pois classificar um conjunto de dados grande provavelmente levará muito tempo (ou se já estiver classificado, você pode simplesmente deixar essa parte para fora) ou como, exatamente, esses comandos funcionam (se eles consumirem 4 GB de ram ou não).

    
por 08.12.2010 / 21:36
0

Você pode remover linhas duplicadas em um arquivo enorme com o PilotEdit.

    
por 19.10.2011 / 15:59
0

Também postei essa resposta em uma pergunta duplicada sobre & gt ; Arquivos de 50 GB

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 blocos 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, as primeiras (1d) e últimas ($ d) linhas de cada cunk 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 arquivo de texto, mas eu assumo binário de qualquer maneira, daí o LANG = (fica tudo mais rápido também).

    
por 01.12.2013 / 21:55
0

Eu encontrei uma ferramenta chamada PilotEdit que foi capaz de fazer isso.

    
por 20.12.2013 / 16:38