2009-09-09 6 views
2

Y at-il une différence dans l'ordre de uniq et de tri lors de leur appel dans un script shell? Je parle ici de temps et d'espace.appeler uniq et trier dans différents ordres dans shell

grep 'somePattern' | uniq | sort 

contre

grep 'somePattern' | sort | uniq 

un test rapide sur une 140 k lignes textfile a montré une légère amélioration de la vitesse (5,5 s contre 5,0 s) pour la première méthode (obtenir des valeurs uniq et puis trier)

Je ne sais pas comment mesurer l'utilisation de la mémoire si

la question est maintenant: est-ce que la commande fait la différence? ou est-il dépendant de la greplines retour (plusieurs/quelques doublons)

je suis impatient de vos réponses

+1

Je recommanderais humblement d'accepter un asnwer différent - sort -u est la façon correcte de faire cela que l'une de vos alternatives. – DVK

+0

sûr, mais la réponse acceptée explique le _why_ mieux – knittl

Répondre

7

La seule correcte ordre est d'appeler uniq après sort, depuis la page de manuel pour uniq dit:

Jeter tous, mais l'une des lignes successives identiques (ou l'entrée standard), écrivant sur la sortie (ou sortie standard).

Par conséquent, il devrait être

grep 'somePattern' | sort | uniq 
+0

merci pour effacer cela! – knittl

+0

J'ai utilisé | uniq | trier | uniq lors de l'extraction de gigaoctets de contenu de fichiers triés juste pour essayer de garder le tri de devoir trier une quantité excessive de données. – Shizzmo

9

Je crois que sort -u est adapté à ce scénario exact, et permettra à la fois les choses de tri et uniquify. Évidemment, cela sera plus efficace que d'appeler sort et uniq individuellement dans n'importe quel ordre.

+1

'sort -u' est un bon indice, et sans aucun doute, il est plus efficace que d'appeler les deux dans l'ordre. MAIS, l'ordre fait une différence (uniq | sort ne fonctionne pas) – knittl

+0

Dans un test rapide, j'ai trouvé que 'sort -u' est environ 7% plus rapide que' sort | uniq'. –

2

uniq dépend des éléments étant triés pour supprimer les doublons (car il compare l'élément précédent et actuel), donc pourquoi est toujours interprété sorte avant uniq. Essayez-le et voyez.

+0

oh ok. cela a du sens :) merci – knittl

Questions connexes