2009-07-25 5 views

Répondre

6

Vous devez trier vos données avant d'utiliser uniq. Il supprime/détecte uniquement les doublons sur les lignes adjacentes.

+0

Ou utilisez un script awk pour faire le travail correctement? –

+0

Merci de l'avoir signalé! --- Il dit même dans le manuel 'L'utilitaire uniq lit le fichier input_file spécifié en comparant les lignes adjacentes -. ' –

+0

Avec mes coreutils GNU uniq le manuel dit: Défaussez toutes sauf une des lignes identiques successives d'INPUT (ou standard entrée), en écrivant à OUTPUT (ou sortie standard). –

1

Essayez cette vérifier, il sortie toutes les lignes qui sont dupliqués:

cat /tmp/1 | awk 'seen[$0]++ == 1' 

Oh, c'est votre problème:

cat /tmp/1 | sort | uniq -d 

Trier avant d'exécuter uniq!

+2

pas besoin d'utiliser chat. – ghostdog74

+0

Les lignes 2 et 7 du fichier d'exemple de Masi sont les mêmes. Mais ils ne sont pas sur des lignes consécutives, ce qui semble être le cœur du malentendu. – dave

+0

ghostdog, eh bien j'utilise le chat car l'OP l'a fait aussi. Oui, je suis conscient que je pourrais utiliser la redirection de shell à la place, ou donner comme argument de ligne de commande à awk ou à trier. dave, merci. Je n'ai pas vu celui-là! édité. –

1
awk '{_[$0]++}END{for(i in _)if(_[i]>1) print i}' /tmp/1 

ou tout simplement

awk '_[$0]++ == 1' file 
+0

awk '_ [$ 0] ++' ne fonctionne que s'il y a au plus un doublon pour chaque ligne avec des doublons. Si vous aviez trois rangées identiques, l'impression était deux fois plus rapide. –