web-dev-qa-db-fra.com

Impression des lignes uniques

Existe-t-il une meilleure solution pour imprimer des lignes uniques autres qu'une combinaison de sort et uniq?

15
Šimon Tóth

Pour imprimer chaque ligne identique, un seul, dans n'importe quel ordre:

sort -u

Imprimer uniquement les lignes uniques, dans n'importe quel ordre:

sort | uniq -u

Pour imprimer chaque ligne identique une seule fois, dans l'ordre de leur première occurrence: (Pour chaque ligne, imprimez la ligne si elle n'a pas encore été vue, alors en tout cas incrémenter le compteur vu)

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

Imprimer uniquement les lignes uniques, dans l'ordre de leur première occurrence: (enregistrez chaque ligne dans seen, ainsi que dans lines si c'est la première occurrence; à la fin de l'entrée, imprimez les lignes par ordre d'occurrence, mais seulement celles qui ne sont vues qu'une fois)

awk '!seen[$0]++ {lines[i++]=$0}
     END {for (i in lines) if (seen[lines[i]]==1) print lines[i]}'

Certaines versions (la plupart?) De sort ont un -u Drapeau qui fait directement la pièce uniq. Peut-être des restrictions de longueur de ligne en fonction de la mise en œuvre, mais vous aviez déjà celles-ci avec de la nature sort|uniq.

3
Mat

Pour la dernière partie de la réponse mentionnée dans: Impression des lignes uniques par @gilles comme réponse à cette question, j'ai essayé d'éliminer la nécessité d'utiliser deux hachages.

Cette solution est pour: Imprimer uniquement les lignes uniques, dans l'ordre de leur première occurrence:

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

Ici, "Counter" stocke un compte de chaque ligne similaire à celle traitée précédemment.
[.____] À la fin, nous imprimons uniquement ces lignes, qui ont une valeur de contre-valeur comme 1.

0
Sarfraaz Ahmed

Perl fonctionne-t-il pour vous? Il peut conserver les lignes dans l'ordre d'origine, même si les doublons ne sont pas adjacents. Vous pouvez également le coder en Python ou awk.

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

Qui peut être raccourci juste

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

Fichier d'entrée donné:

abc
def
abc
ghi
abc
def
abc
ghi
jkl

Cela donne la sortie:

abc
def
ghi
jkl
0
Jonathan Leffler