Voici les commandes sur un fichier aléatoire de pastebin :
wget -qO - http://pastebin.com/0cSPs9LR | wc -l
350
wget -qO - http://pastebin.com/0cSPs9LR | sort -u | wc -l
287
wget -qO - http://pastebin.com/0cSPs9LR | sort | uniq | wc -l
287
wget -qO - http://pastebin.com/0cSPs9LR | sort | uniq -u | wc -l
258
Les pages de manuel ne disent pas clairement ce que fait le -u
drapeau. Aucun conseil?
Réponses:
Version courte:
uniq
sans-u
, rend chaque ligne de la sortie unique.uniq -u
imprime seulement chaque ligne unique de l’entrée .Version légèrement plus longue:
uniq
est destiné à traiter des fichiers dont les lignes sont dupliquées et uniquement lorsque ces lignes apparaissent successivement dans l'entrée. Ainsi, pour ses besoins, une ligne unique est une ligne qui n'est pas dupliquée immédiatement.(
uniq
a une mémoire à court terme très limitée; il ne se souviendra jamais si une ligne est apparue plus tôt dans l'entrée, à moins que ce soit la ligne immédiatement précédente - c'est pourquoi iluniq
est très souvent associé àsort
.)Lorsqu'il rencontre une série de lignes en double
uniq
, sans l'-u
argument, en imprime une copie. (Chaque ligne de la sortie est unique ).Avec l'
-u
argument, il n'imprime aucune copie de cette ligne. Les doublons sont simplement omis de la sortie.la source
sort -u
placesort | uniq
.uniq
normalisation et de la collationnement le fait, oui. Mais même dans ce cas, il s’agit uniquement d’une considération locale: vous savez où la ligne apparaîtra dans la sortie triée et vous n’avez plus qu’à sélectionner celle de plusieurs lignes adjacentes à conserver. Si l'entrée n'est pas triée, la décision affecte l'ensemble de l'opération d'unification. Par exemple, si vous souhaitez conserver la dernière copie, vous ne pouvez rien afficher tant que vous n'avez pas lu la dernière ligne de l'entrée ...uniq
avec-u
passe toutes les lignes qui ont des doublons. Ainsi:Habituellement,
uniq
imprime les lignes au plus une fois (en supposant que l’entrée soit triée). Cette option permet d’imprimer des lignes véritablement uniques (qui ne sont plus apparues).la source
uniq
pourrait appelerdistinct
, car il imprime toutes les lignes distinctes, alors queuniq -u
toutes les lignes uniques sont imprimées.uniq
dans certaines langues.Uniq POSIX spec l'a décrit clairement:
-u
option makeuniq
pour ne pas imprimer les lignes répétées.La plupart des
uniq
implémentations utilisaient la comparaison d'octets, tandis que GNUuniq
utilisait l'ordre de tri pour filtrer les lignes dupliquées. Donc, cela peut produire un résultat erroné dans certaines locales, exemple dansen_US.UTF-8
locale:et
-u
ne vous a pas donné de lignes:Vous devez donc définir les paramètres régionaux sur
C
pour obtenir la comparaison d'octets:la source
uniq
(bien qu’apparemment, l’intention de POSIX était de faire la comparaison entre octets au lieu de la comparaison avec strcoll () comme danssort -u
) comme les environnements locaux dans lesquels ① trie de manière identique le même que. Au moins, GNUuniq
est compatible avecsort -u
.uniq
obligation de faire memcmp / strcmp plutôt que strcoll, ce n'est pas très évident pour moi, mais c'était pour Geoff . À propos des environnements locaux GNU ayant «triant la même chose que», il s'agit clairement d'un bogue, car il n'y a aucune raison pour qu'ils trient la même chose C'est autorisé par POSIX, mais des changements sont à venir .Ordinaire:
uniq: pas deux lignes répétées
triés
sort -u: pas deux lignes répétitives
sort / uniq: tous distincts
compte des occurrences distinctes
seulement les lignes qui ne sont pas répétées (non triées en premier)
seulement les lignes qui ne sont pas répétées (après le tri)
uniq -d: imprime uniquement les lignes en double, une pour chaque groupe
.. compté
la source