Partout où je vois quelqu'un qui a besoin d'une liste unique et triée, il le fait toujours sort | uniq
. Je n'ai jamais vu d'exemples où quelqu'un utilise à la sort -u
place. Pourquoi pas? Quelle est la différence et pourquoi est-il préférable d'utiliser uniq plutôt que le drapeau unique pour trier?
120
Réponses:
sort | uniq
existait auparavantsort -u
et est compatible avec un plus grand nombre de systèmes, bien que presque tous les systèmes modernes prennent en charge-u
- c’est POSIX. Il est la plupart du temps un retour à l'époque oùsort -u
n'existaient pas (et les gens tendent à ne pas changer leurs méthodes si la façon dont ils savent continue à travailler, il suffit de regarder parifconfig
rapport à l'ip
adoption).Les deux ont probablement été fusionnés, car la suppression des doublons dans un fichier nécessite un tri (au moins, dans le cas standard), et constitue un cas d'utilisation extrêmement courant. Il est également plus rapide en interne car il permet de réaliser les deux opérations en même temps (et du fait qu’il n’exige pas d’IPC entre
uniq
etsort
). Surtout si le fichier est volumineux, voussort -u
utiliserez probablement moins de fichiers intermédiaires pour trier les données.Sur mon système, j'obtiens régulièrement des résultats comme celui-ci:
Il masque également ne pas le code de retour
sort
, qui peut être important (dans des coquilles modernes , il existe des moyens pour obtenir, par exemple,bash
l »$PIPESTATUS
ensemble, mais ce ne fut pas toujours vrai).la source
sort | uniq
parce que 9 fois sur 10, je suis en train de faire pipinguniq -c
.sort -u
faisait partie de la 7e édition d'UNIX, vers 1979. Les versions desort
sans support pour-u
sont vraiment archaïques - ou ont été écrites sans tenir compte du standard de facto avant le standard de jure de POSIX. Voir aussi Stack Overflow Sort & uniq dans le shell Linux à partir de 2010.ip
. Nous sommes en 2016 et cette publication en 2013, mais je ne connais que laip
commande maintenant.uniq -c
" (et peut-être encore une foissort -nr | head
). Je me demandais à quoi équivautsort | uniq
dans Vim quand j'ai découvert que Vim avait le:sort u
commandement. Et TILsort -u
existe aussi.sort -n | uniq
rapportsort -n -u
. Par exemple, les espaces de début et de fin seront considérés comme des doublons,sort -n -u
mais pas par les précédents!echo -e 'test \n test' | sort -n -u
retournetest
, maisecho -e 'test \n test' | sort -n | uniq
retourne les deux lignes.Une différence réside dans le
uniq
nombre d'options supplémentaires utiles, telles que le saut de champs pour la comparaison et le comptage du nombre de répétitions d'une valeur.sort
Le-u
drapeau de n'implémente que les fonctionnalités de launiq
commande sans fioritures .la source
sort -u
ne peut pas êtreuniq
utilisé pour utiliser certaines des options utiles de ce dernier, telles que le saut de champs pour la comparaison et le comptage du nombre de répétitions."Avec les normes
sort
s etuniq
s compatibles avec POSIX (GNUuniq
n’est actuellement pas conforme à cet égard), il existe une différence ensort
utilisant l’algorithme de classement des paramètres régionaux pour comparer les chaînes (généralement utiliséstrcoll()
pour comparer les chaînes) tout enuniq
vérifiant l’identité en valeur des octets (généralement utiliséestrcmp()
). .Cela compte pour au moins deux raisons.
Dans certains paramètres régionaux, en particulier sur les systèmes GNU, différents caractères trient de la même manière. Par exemple, dans les paramètres régionaux en_US.UTF-8 sur un système GNU, tous les caractères ①②③④⑤⑥⑦⑧⑨⑩ ... et beaucoup d'autres sont identiques, car leur ordre de tri n'est pas défini. Les chiffres arabes 0123456789 sont du même ordre que leurs homologues indiens de l’indien arabe oriental (٠١٢٣٤٥٦٧٨٩).
Car
sort -u
, ① trie la même chose que et 0123, pareil que ٠١٢٣,sort -u
n'en retiendrait qu'un, alors que pouruniq
(pas GNUuniq
qui utilisestrcoll()
(sauf avec-i
)), ① est différent de et 0123, différent de, doncuniq
considérerait tout 4 unique.strcoll
peut uniquement comparer des chaînes de caractères valides (le comportement n'est pas défini selon POSIX lorsque l'entrée contient des séquences d'octets qui ne forment pas des caractères valides), alorsstrcmp()
que les caractères sont indifférents, car ils ne font que comparer octet par octet. C'est donc une autre raison pour laquellesort -u
vous ne pouvez pas vous donner toutes les lignes uniques si certaines ne forment pas un texte valide.sort|uniq
, bien que non spécifiée pour la saisie non textuelle, est plus susceptible de vous donner des lignes uniques pour cette raison.À côté de ces subtilités, une chose qui n’a pas été remarquée jusqu’à présent est que la
uniq
ligne entière est comparée lexicalement, tandis quesort
la-u
comparaison de est basée sur la spécification de tri donnée sur la ligne de commande.la source
Je préfère utiliser
sort | uniq
parce que lorsque j'essaie d'utiliser l'-u
option (éliminer les doublons) pour supprimer les doublons impliquant des chaînes de casse mixtes, il n'est pas facile de comprendre le résultat.Remarque: avant de pouvoir exécuter les exemples ci-dessous, vous devez simuler la séquence de classement C standard en procédant comme suit:
Par exemple, si je veux trier un fichier et supprimer les doublons, tout en maintenant les différentes cas de chaînes distinctes.
Cette confusion est résolue en n'utilisant pas l'
-u
option de suppression des doublons. L'utilisationuniq
est plus prévisible. La première ci-dessous trie et ignore le cas, puis le passe àuniq
pour supprimer les doublons.la source
-u
option desort
sortie du premier d'une exécution égale (voir la page de manuel). Ainsisort -fu
, la première occurrence de chaque ligne unique insensible à la casse est prise en compte. La logiquesort
utilisée pour supprimer les doublons est prévisible.Une autre différence que j'ai constatée aujourd'hui concerne le tri basé sur un délimètre où
sort -u
l'indicateur unique s'applique uniquement à la colonne avec laquelle vous triez.la source