Removendo duplicatas em uma lista de texto grande

2

Eu pesquisei pela internet e empilhá-los para isso. Embora haja muitos tópicos semelhantes, ainda não encontrei uma solução.

Portanto, tenho uma lista bastante grande (aprox. 20 GB), que contém cerca de 5% de linhas duplicadas. Quero filtrar essa lista, para que uma das duplicatas seja excluída. Exemplo:

Entrada:

test123
Test123
test
test123
test 123

Saída:

test123
Test123
test
test 123

Se a lista é classificada ou não, não importa.

Já experimentei sort -u -o output.txt , também sort -us -o output.txt . Funciona bem para arquivos menores, mas quando tento fazer arquivos com mais de aprox. 4GB, o arquivo resultante é suspeitamente pequeno e, em vez de um arquivo .txt, aparentemente se tornou um "emacs-lisp-source-text".

Eu ficaria muito grato se alguém pudesse me ajudar!

    
por user146854 10.12.2015 / 10:26

2 respostas

2

Testado com GNU sort do GNU coreutils 8.26, não tive nenhum problema em classificar um arquivo de 5GiB. Então, você poderia tentar instalar aquele.

Coisas a ter em mente:

  • sort -u não oferece linhas exclusivas, mas uma de todas as linhas que ordenam o mesmo. Nos sistemas GNU, especialmente em sua localidade típica, existem vários caracteres que ordenam o mesmo. Se você quiser linhas exclusivas em nível de byte, use LC_ALL=C sort -u .
  • sort usa arquivos temporários para grandes entradas para classificar em partes para não usar toda a memória. Se você não tiver espaço suficiente em seu diretório temporário (geralmente /tmp , a menos que tenha definido $TMPDIR ), ele falhará. Defina $TMPDIR (veja também a opção -T com GNU sort ) para um diretório com espaço livre suficiente.
por 10.03.2017 / 15:55
0
printf "">OutputFile
cat InputFile | 
while IFS= read -r line; do 
  if [ ! -z "$line" ]; then
    if ! grep -Fxqe "$line" OutputFile; then
      echo "$line">>OutputFile;
    fi
  fi
done

Explicação

Crie um novo OutputFile em printf "">OutputFile

Canalize o InputFile para um loop while em cat InputFile |

Leia cada linha em while IFS= read -r line; do

Manipule linhas em branco em if [ ! -z "$line" ]; then

Verifique se a linha já está em OutputFile
Se os resultados estiverem vazios, ainda não estão no OutputFile (isto é, é exclusivo)
if ! grep -Fxqe "$line" OutputFile; then

Coloque a linha no OutputFile em echo "$line">>OutputFile;

    
por 10.03.2017 / 23:16