Entfernen Sie Zeilen, die auf Duplikaten innerhalb einer Spalte basieren, ohne zu sortieren

30

Ich habe große Dateien mit drei Spalten (~ 10.000 Zeilen) und möchte Zeilen entfernen, wenn der Inhalt der dritten Spalte dieser Zeile in der dritten Spalte einer anderen Zeile erscheint. Die Dateigrößen machen die Sortierung etwas umständlich, und ich kann den folgenden Code nicht verwenden, da nicht alle Zeilen identisch sind. nur der Inhalt von Spalte 3.

awk '!seen[$0]++' filename
Zach C
quelle

Antworten:

31

Ändern Sie einfach Ihren awk-Befehl in die Spalte, die Sie ausführen möchten, um doppelte Zeilen basierend auf (in Ihrem Fall die dritte Spalte) zu entfernen:

awk '!seen[$3]++' filename

Dieser Befehl gibt an, awkwelche Zeilen gedruckt werden sollen. Die Variable $3enthält den gesamten Inhalt von Spalte 3, und eckige Klammern stehen für den Array-Zugriff. Für jede dritte Spalte der Zeile im Dateinamen wird der Knoten des genannten Arrays seeninkrementiert und die Zeile gedruckt, wenn der Inhalt dieses Knotens (Spalte3 !) zuvor nicht ( ) festgelegt wurde.

Der obige awkBefehl funktioniert, wenn Ihre Spalten in der Eingabedatei mit spaceoder Tabzwischen sich selbst getrennt sind. Wenn die Spalten mit etwas anderem getrennt sind, müssen Sie angeben, dass awk mit der entsprechenden -FOption aktiviert werden soll . Beispiel: Wenn alle Spalten durch Komma ( ,) getrennt sind und Zeilen basierend auf der dritten Spalte entfernt werden sollen, verwenden Sie die -F','Option.

awk -F',' '!seen[$3]++' filename
αғsнιη
quelle
18

sortBefehl ist bereits für die Verarbeitung großer Dateien optimiert. Sie können den sortBefehl für Ihre Datei also sehr gut verwenden als:

sort -u -t' ' -k3,3 file
  • -u - Nur die eindeutigen Zeilen drucken.
  • -t- Geben Sie das Trennzeichen an. Hier in diesem Beispiel verwende ich nur das Leerzeichen als Trennzeichen.
  • -k3,3 - auf 3. Feld sortieren.

Sie könnten auf diese Antwort verweisen, die nahelegt, dass GNU sort in der Tat der bessere Ansatz zum Sortieren großer Dateien ist. In Ihrem Fall, denke ich auch ohne -parallel, könnten Sie Ihr Endergebnis ohne viel Zeitverzögerung erreichen.

Ramesh
quelle
Wollte snarkily kommentieren, das -uwürde nur doppelte Zeilen entfernen , keine doppelten Schlüssel ... aber ich liege falsch.
Randoms
@Ramesh es macht den Job, aber das Sortieren ändert die Reihenfolge der Zeilen, die ich nicht immer erwartet habe.
Bharat