Sélectionnez unique ou de valeurs distinctes à partir d'une liste en shell script UNIX
J'ai un script ksh qui renvoie une longue liste de valeurs, de retour à la ligne sont séparés, et je veux voir seulement l'unique/valeurs distinctes. Il est possible de faire cela?
Par exemple, dire que ma sortie est suffixes de fichier dans un répertoire:
tar gz java gz java tar class class
Je veux voir une liste comme:
tar gz java class
Vous devez vous connecter pour publier un commentaire.
Vous voudrez peut-être regarder à l'
uniq
etsort
applications.(Pour info, oui, le tri est nécessaire dans cette ligne de commande,
uniq
seulement des bandes de dupliquer les lignes qui sont immédiatement après l'autre)EDIT:
Contrairement à ce qui a été posté par Aaron Digulla par rapport à
uniq
s'options de ligne de commande:Donnée d'entrée suivantes:
uniq
sera de sortie de toutes les lignes exactement une fois:uniq -d
va afficher toutes les lignes qui apparaissent plus d'une fois, et les imprimer en une fois:uniq -u
va afficher toutes les lignes qui apparaissent exactement une fois, et les imprimer en une fois:sort
dispose d'un-u
version pour donner les valeurs uniques aussi.uniq
coutures pour traiter uniquement les lignes adjacentes (au moins par défaut) sens qu'on pourraitsort
d'entrée avant de nourriruniq
.C'est le même que monoxyde de réponse, mais un peu plus concis.
... | sort | uniq
, car il est effectué en un seul coupPour les grands ensembles de données où le tri peut ne pas être souhaitable, vous pouvez également utiliser le script perl suivant:
Ce fondamentalement juste se souvient de chaque ligne de sortie de sorte qu'il n'est pas sortie encore.
Il a l'avantage sur le "
sort | uniq
" solution qu'il n'y a pas de tri nécessaire à l'avance.Avec zsh vous pouvez faire ceci:
Ou vous pouvez utiliser AWK:
awk
solution (voir stackoverflow.com/a/21200722/45375 pour une explication) va travailler avec de gros fichiers aussi longtemps que le nombre de lignes est assez petit (comme des lignes uniques sont gardés en mémoire). Lezsh
solution de lit tout le fichier en mémoire, ce qui peut ne pas être une option avec de gros fichiers. Aussi, comme l'écrit, seules les lignes ayant pas intégré les espaces sont gérés correctement; pour résoudre ce problème, utilisezIFS=$'\n' read -d '' -r -A u <file; print -l ${(u)u}
à la place.(IFS=$'\n' u=($(<infile)); print -l "${(u)u[@]}")
[@]
suffixe de référence à tous les éléments d'un tableau - semble du moins que de la version 5, il fonctionne sans elle; ou avez-vous juste ajouter pour plus de clarté?print -l "${(fu)$(<infile)}"
awk
un exemple de sortie trop.Pipe travers
sort
etuniq
. Cela supprime tous les doublons.uniq -d
donne seulement les doublons,uniq -u
donne seulement l'unique (des bandes de doublons).uniq -u
n'est PAS le comportement par défaut (voir la modifier dans ma réponse pour plus de détails)Avec AWK vous pouvez le faire, je le trouve plus rapide que le tri
Unique, comme demandé, (mais non triés);
utilise moins de ressources système pour les moins de ~70 éléments (testé avec le temps);
écrit à partir de stdin,
(ou de les modifier et de les inclure dans un autre script):
(Bash)