Entfernen Sie nicht doppelte Zeilen in Linux

1987
qlwik

Wie kann ich nicht-doppelte Zeilen aus einer Textdatei entfernen, indem Sie ein Linux-Programm verwenden? linke, awk oder ein anderes?

Beispiel:

abc bbc abc bbc ccc bbc 

Ergebnis:

abc bbc abc bbc bbc 

Die zweite Liste hat ccc entfernt, da es keine doppelten Zeilen gab.

Ist es auch möglich, Zeilen zu entfernen, bei denen es sich nicht um doppelte UND-Zeilen handelt, die nur zwei Duplikate haben, und diejenigen, die mehr als zwei Duplikate haben, zurücklassen?

2
Ist die Reihenfolge wichtig? Sind die Linien auch alle gleich lang, oder welches Muster haben sie? Julie Pelletier vor 7 Jahren 0
Linien haben unterschiedliche Längen, die Reihenfolge ist nicht wichtig. qlwik vor 7 Jahren 0

2 Antworten auf die Frage

5
MariusMatutiae

Die Lösungen, die von anderen gepostet wurden, funktionieren nicht für meinen Debian-Jessie: Sie behalten eine einzige Kopie einer doppelten Zeile, während ich nach meinem Verständnis des OP alle Kopien der doppelten Zeilen aufzubewahren habe. Wenn ich das OP richtig verstanden habe, dann ...

  1. Der folgende Befehl

    awk '!seen[$0]++' file 

    Entfernt alle doppelten Zeilen.

  2. Der folgende Befehl

    awk 'seen[$0]++' file 

    Ausgänge alle Duplikate, aber nicht das Original: das heißt, wenn eine Zeile erscheint n mal, es gibt die Zeile n-1 mal.

  3. Dann der Befehl

    awk 'seen[$0]++' file > temp && awk '!seen[$0]++' file >> temp 

    löst dein Problem. Die Zeilen befinden sich nicht in der ursprünglichen Reihenfolge.

  4. Wenn Sie Zeilen mit zwei oder mehr Duplikaten haben möchten, können Sie jetzt die obigen Schritte wiederholen:

    awk 'seen[$0]++' file | awk 'seen[$0]++' > temp 

    behält n-2 Kopien der Zeilen mit n> 1 Duplikaten. Jetzt

    awk '!seen[$0]++' temp > temp1 

    entfernt alle doppelten Zeilen aus der temporären Datei, und Sie können jetzt das gewünschte Element ( dh nur die Zeilen mit n> 1 Duplikaten) wie folgt erhalten:

    cat temp1 >> temp; cat temp1 >> temp 
  5. Wenn Sie dies für Zeilen tun müssen, die N oder mehrmals vorkommen, geben Sie den folgenden Befehl ein

     awk 'seen[$0]++ && seen[$0] > N' file 

    ist einfacher als das N- fache des Befehls awk 'seen[$0]++' file.

3
UUU

Sie können sort& uniqBefehle dafür verwenden.

Wenn Ihre Daten in einer abc.txt-Datei sind, dann;

cat abc.txt |sort|uniq -d 

Aussetzen wird sein;

abc  bbc