Imprimindo linhas exclusivas

10

Existe alguma solução melhor para imprimir linhas exclusivas que não seja uma combinação de sort e uniq ?

    
por Let_Me_Be 22.03.2011 / 23:29

4 respostas

19

Para imprimir cada linha idêntica apenas uma, em qualquer ordem:

sort -u

Para imprimir apenas as linhas exclusivas, em qualquer ordem:

sort | uniq -u

Para imprimir cada linha idêntica apenas uma vez, na ordem de sua primeira ocorrência: (para cada linha, imprima a linha se ainda não foi vista e, em qualquer caso, incremente o contador visto)

awk '!seen[$0] {print}
     {++seen[$0]}'

Para imprimir somente as linhas exclusivas, na ordem de sua primeira ocorrência: (registre cada linha em seen , e também em lines se for a primeira ocorrência; no final da entrada, imprima as linhas em ordem de ocorrência, mas apenas as vistas apenas uma vez)

awk '!seen[$0]++ {lines[i++]=$0}
     END {for (i in lines) if (seen[lines[i]]==1) print lines[i]}'
    
por 23.03.2011 / 00:06
2

Algumas (mais?) versões de sort têm um sinal -u que faz a parte uniq diretamente. Pode haver algumas restrições de comprimento de linha, dependendo da implementação, mas você já tinha aquelas com sort|uniq .

    
por 22.03.2011 / 23:42
0

Perl trabalha para você? Pode manter as linhas na ordem original, mesmo que as duplicatas não sejam adjacentes. Você também pode codificá-lo em Python ou awk .

while (<>) {
    print if $lines{$_}++ == 0;
}

Que pode ser reduzido para apenas

perl -ne 'print unless $lines{$_}++;'

Dado arquivo de entrada:

abc
def
abc
ghi
abc
def
abc
ghi
jkl

Produz a saída:

abc
def
ghi
jkl
    
por 06.04.2017 / 10:07
0

Para a última parte da resposta mencionada em: Imprimindo linhas exclusivas por @Gilles como uma resposta a essa pergunta, tentei eliminar a necessidade de usar dois hashes.

Esta solução é para: imprimir apenas as linhas exclusivas, na ordem da primeira ocorrência:

awk '{counter[$0]++} END {for (line in counter) if (counter[line]==1) print line}'

Aqui, "contador" armazena uma contagem de cada linha que é semelhante àquela processada anteriormente.
No final, imprimimos apenas as linhas que têm valor de contador como 1.

    
por 02.10.2017 / 18:18