Como obter apenas os resultados exclusivos sem precisar classificar os dados?

35
$ cat data.txt 
aaaaaa
aaaaaa
cccccc
aaaaaa
aaaaaa
bbbbbb
$ cat data.txt | uniq
aaaaaa
cccccc
aaaaaa
bbbbbb
$ cat data.txt | sort | uniq
aaaaaa
bbbbbb
cccccc
$

O resultado que eu preciso é exibir todas as linhas do arquivo original, removendo todas as duplicatas (não apenas as consecutivas), mantendo a ordem original das instruções no arquivo .

Aqui, neste exemplo, o resultado que eu realmente estava procurando era

aaaaaa
cccccc
bbbbbb

Como posso executar essa operação uniq generalizada em geral?

    
por Lazer 24.04.2011 / 22:23

4 respostas

50
perl -ne 'print unless $seen{$_}++' data.txt

Ou, se você precisar de um uso inútil de cat :

cat data.txt | perl -ne 'print unless $seen{$_}++'

Veja aqui uma tradução de awk , para sistemas que não possuem Perl:

awk '!seen[$0]++' data.txt
cat data.txt | awk '!seen[$0]++'
    
por 24.04.2011 / 22:57
14

john tem uma ferramenta chamada unique :

usr@srv % cat data.txt | unique out
usr@srv % cat out
aaaaaa
cccccc
bbbbbb

Para conseguir o mesmo sem ferramentas adicionais em uma única linha de comando é um pouco mais complexo:

usr@srv % cat data.txt | nl | sort -k 2 | uniq -f 1 | sort -n | sed 's/\s*[0-9]\+\s\+//'
aaaaaa
cccccc
bbbbbb

nl imprime os números de linha na frente das linhas, portanto, se sort / uniq estiver por trás deles, poderemos restaurar a ordem original das linhas. sed apenas exclui os números da linha depois;)

    
por 24.04.2011 / 22:31
6

Eu prefiro usar isso:

cat -n data.txt | sort --key=2.1 -b -u | sort -n | cut -c8-

cat -n adiciona números de linha,

sort --key=2.1 -b -u classifica no segundo campo (após os números de linha adicionados), ignorando espaços em branco à esquerda, mantendo linhas exclusivas

sort -n classifica em ordem numérica estrita

cut -c8- mantém todos os caracteres da coluna 8 a EOL (ou seja, omitem os números de linha que incluímos)

    
por 29.07.2013 / 20:53
2

Perl tem um módulo que você pode usar que inclui uma função chamada uniq . Portanto, se você tiver seus dados carregados em uma matriz em Perl, basta chamar a função para torná-la única, mantendo a ordem original.

use List::MoreUtils qw(uniq)    
@output = uniq(@output);

Você pode ler mais sobre este módulo aqui: List :: MoreUtils

    
por 30.01.2014 / 21:38