Excluindo linhas duplicadas no arquivo de texto…?

5

Como posso excluir linhas duplicadas em um arquivo de texto via prompt de comando?

Por exemplo: Eu tenho um arquivo de texto de 10MB e quero manter apenas uma linha de My line , mas em algum lugar no arquivo de texto existem 2 My line s.

    
por user95942 28.09.2015 / 08:38

3 respostas

11

Usando o awk

awk '!x[$0]++' infile.txt > outfile.txt

o modo como funciona é que ele mantém a contagem das linhas em uma matriz e, se a contagem atual for zero, isto é, a primeira ocorrência, a linha será impressa, caso contrário, ela continuará para a próxima.

    
por user448115 28.09.2015 / 08:53
5

Existem várias maneiras de fazer isso. Se a encomenda não for importante, ordenar e uniq são mais fáceis de lembrar. No entanto, se você quiser manter a ordenação do arquivo de texto e, ao mesmo tempo, excluir duplicatas, o awk fará o truque. Você também pode usar sed eu acredito.

Aqui está um exemplo

/tmp/debugSys>cat fileWithDupText.txt 
line2
line21
line2
line1
line2
/tmp/debugSys>

/tmp/debugSys>cat fileWithDupText.txt | awk '!a[$0]++' 
line2
line21
line1
/tmp/debugSys>sort fileWithDupText.txt | uniq
line1
line2
line21
/tmp/debugSys>sort -u fileWithDupText.txt 
line1
line2
line21
/tmp/debugSys>
    
por Amit 28.09.2015 / 09:07
2

Encontrou um bom liner Perl para isso, usando hashes md5 ;) , mas isso é lento e só vale a pena se você tiver linhas muito longas e um arquivo enorme onde reduzirá bastante a memória use:

perl -MDigest::MD5 -ne '$seen{Digest::MD5::md5($_)}++ or print' foo

Portanto, simplesmente use

perl -ne '$seen{$_}++ or print' foo

Fonte

Exemplo

cat foo

foo
fii
foo bar
foobar
foobar
foo

perl -ne '$seen{$_}++ or print' foo

foo
fii
foo bar
foobar
    
por A.B. 28.09.2015 / 13:32