web-dev-qa-db-fra.com

Comment imprimer uniquement les lignes uniques en BASH?

Comment imprimer uniquement les lignes qui apparaissent exactement une fois dans un fichier? Par exemple, étant donné ce fichier:

mountain
forest
mountain
eagle

La sortie serait la suivante, car la ligne mountain apparaît deux fois:

forest
eagle
  • Les lignes peuvent être triées, si nécessaire.
18
Village

Utiliser awk:

awk '{!seen[$0]++};END{for(i in seen) if(seen[i]==1)print i}' file
eagle
forest
12
anubhava

Utilisez sort et uniq:

sort inputfile | uniq -u

Le -u l'option entraînerait uniq à imprimer uniquement des lignes uniques. Citant de man uniq:

   -u, --unique
          only print unique lines

Pour votre contribution, cela produirait:

eagle
forest

Obs: N'oubliez pas de sort avant uniq -u car uniq fonctionne sur lignes adjacentes . Et alors uniq -u en fait, c'est d'imprimer des lignes qui n'ont pas de lignes voisines identiques, mais cela ne signifie pas qu'elles sont vraiment uniques. Lorsque vous sort, toutes les lignes identiques sont regroupées et seules les lignes vraiment uniques dans le fichier resteront après uniq -u.

44
devnull

Vous avez presque eu la réponse dans votre question:

sort filename | uniq -u

7
Oliver Matthews