2010-04-08 6 views
13

Suchen Sie nach einem awk (oder sed) Einzeiler, um Zeilen aus der Ausgabe zu entfernen, wenn das erste Feld ein Duplikat ist.Zeile entfernen, wenn das Feld doppelt vorhanden ist

Ein Beispiel zum Entfernen von doppelten Zeilen ich gesehen habe, ist:

awk 'a !~ $0; {a=$0}' 

Versuchte es für eine Basis ohne Glück mit (Ich dachte, das Ändern der in $ 0 $ 1 ist würde den Trick tun, aber schien nicht zu funktionieren).

+0

Sie fragte Linien zu entfernen ‚wenn der erste Feld Streichhölzer‘ ... was? Ich habe 'denselben Wert wie das erste Feld in einer vorherigen Eingabezeile' angenommen; eine andere Person nahm "ein bestimmtes Muster an". Was hast du vor? –

+0

Ihre geänderte Version 'awk 'a! ~ $ 1; {a = $ 1} '' * funktioniert für mich * für benachbarte Duplikate (z. B. eine sortierte Datei). ** Die Version ** von Jonathan Leffler hat den Vorteil, dass Duplikate in einer unsortierten Datei entfernt werden, aber auf Kosten der Erstellung eines potenziell großen Arrays. –

+0

Ich denke, mein Hauptproblem war, dass ich mit ein paar verschiedenen Arten von Feldtrennern zu tun hatte und FS nicht richtig definierte. – Kyle

Antwort

25

Dies ist eine Standard (sehr einfache) Verwendung für assoziative Arrays.

+0

Das hat funktioniert! Ich hatte einen weiteren Fehler, den ich nicht erkannte, der mir auch Probleme bereitet hat. Vielen Dank! – Kyle

8

dies ist, wie Duplikate zu entfernen

awk '!_[$1]++' file 
+2

Verwenden Sie '_' als Array-Namen lädt Missverständnisse - aber es funktioniert. –

1

Wenn Sie mit Perl geöffnet sind:

perl -ane 'print if ! $a{$F[0]}++' file 

-a die Leitung in die @F Array autosplits, die beginnend bei 0 indiziert ist
Der %a Hash merkt sich, wenn das erste Feld bereits gesehen wurde


Diese verwandten Lösung setzt voraus, Ihre Feldtrenn ein Komma ist, anstatt Leerzeichen

perl -F, -ane 'print if ! $a{$F[0]}++' file