L'utilisation de la sort
commande sera probablement l'option la plus rapide.
Mais vous voudrez probablement fixer les paramètres régionaux à C.
sort -u
ne rapporte pas de lignes uniques, mais une de chaque série de lignes qui trient de la même manière. Dans les paramètres régionaux C, deux lignes différentes ne trient pas nécessairement de la même façon, mais ce n'est pas le cas dans la plupart des paramètres régionaux basés sur UTF-8 sur les systèmes GNU.
De plus, l'utilisation de la locale C évite les coûts supplémentaires liés à l'analyse du format UTF-8 et au traitement des ordres de tri complexes, ce qui améliorerait considérablement les performances.
Alors:
LC_ALL=C sort -u file
Vous pouvez également améliorer les performances en utilisant un lecteur plus rapide (ou un lecteur différent de celui où se trouvent les fichiers d'entrée et / ou de sortie) des fichiers temporaires (à l'aide de -T
ou$TMPDIR
variable d'environnement), ou en jouant avec l' -S
option prise en charge par certainssort
implémentations) .
Pour certains types d'entrée ou pour un stockage lent, l'utilisation de l' --compress-program
option GNU sort
(avec, par exemple lzop
) peut améliorer les performances en plus de l'utilisation du stockage.
Maintenant, juste une note pour ceux qui objectent (à juste titre dans une certaine mesure) que ce ne sera pas le bon ordre :
Je conviens qu'en tant qu'être humain, j'aimerais voir Stéphane faire le tri entre Stefan et Stéphanie , mais:
- Un ordinateur voudrait que Stéphane trie après
é
(au moins sous la forme U + 00E9) sous forme de caractère ou que les octets de son codage UTF-8 soient triés après (en termes de nombre de points ou de points de code). C'est un ordre de tri très simple à mettre en œuvre, un ordre total strict et sans surprise.
L'ordre de tri de vos paramètres régionaux ne sera probablement pas satisfaisant dans de nombreux cas, même pour un humain. Par exemple, sur mon système avec les paramètres régionaux en_GB.utf8 par défaut:
Stéphane et Stéphane (l'un avec U + 00E9, l'autre avec eU + 0301) ne font pas le même tri:
$ printf '%b\n' 'Ste\u0301phane' 'St\u00e9phane' | sort -u
Stéphane
Stéphane
mais ③, ①, ② sont tous identiques (il s'agit évidemment d'un bogue dans ces définitions de paramètres régionaux):
$ printf '%s\n' ③ ① ② | sort -u
③
Ici, c'est, mais ça aurait tout aussi bien pu être ou
Donc, IMO, il y a de fortes chances que vous souhaitiez toujours utiliser sort -u
LC_ALL = C si vous voulez des lignes uniques. Et si vous souhaitez que la liste résultante soit triée dans l'ordre de tri de l'utilisateur, redirigez-la à sort
nouveau:
LC_ALL=C sort -u | sort
LC_ALL=C sort | LC_ALL=C uniq -c | sort -k2
/tmp
.