2010-12-10 4 views
1

Je souhaite imprimer les lignes non dupliquées en fonction du 1er champ en utilisant AWK. Quelqu'un pourrait-il aider s'il vous plaît?Comment imprimer des lignes non dupliquées en fonction d'un champ avec AWK?

Merci

Input 

    1 28324 2077 2 1 
    1 24682 2088 1 0 
    1 25399 2074 1 0 
    2 28925 1582 2 1 
    3 30254 1450 1 0 
    4 25552 1131 1 1 
    4 31033 1134 1 0 
    5 29230 1522 2 0 


    Desired Output 
    2 28925 1582 2 1 
    3 30254 1450 1 0 
    5 29230 1522 2 0 
+0

Vous voulez dire dupliquées par la première colonne. Est-ce toujours trié? – khachik

+0

Oui, mais cela devrait-il dépendre du tri? – Tony

Répondre

3
awk ' 
(count[$1]++ < 1) { data[$1] = $0; } 
END    { for (x in data) if (count[x] == 1) print data[x]; } 
' 

Si la sortie doit être triée sur la première colonne, redirigez par sort -nk1.

+1

Vous devez post-incrémenter l'élément de tableau. Je ne reçois aucune sortie avec votre code tel qu'il est. –

+0

Pourriez-vous faire face à un débordement? –

+0

@belisarius: Je ne suppose pas que je n'ai jamais plus de 2^enregistrements wordize du même type. En fait, je gère des jeux de données aussi volumineux en utilisant MongoDB, pas un seul fichier texte et awk. –

1

Si vos données sont triées, vous pouvez utiliser celle-ci qui n'accumule pas un tableau potentiellement volumineux.

awk ' 
    $1 != prev { if (count == 1) print line; count = 0 } 
       { prev=$1; line = $0; ++count } 
      END { if (count == 1) print }' inputfile 
1

Pour nombre fixe de caractères dans la première colonne et uniq mise en œuvre qui prend en charge l'option -w:

sort infile|uniq -uw1 
Questions connexes