it-swarm.com.de

Entfernen Sie Zeilen basierend auf Duplikaten innerhalb einer Spalte ohne Sortierung

Ich habe große 3-Spalten-Dateien (~ 10.000 Zeilen) und möchte Zeilen entfernen, wenn der Inhalt der dritten Spalte dieser Zeile in der dritten Spalte einer anderen Zeile angezeigt wird. Die Größe der Dateien macht das Sortieren etwas umständlich, und ich kann so etwas wie den folgenden Code nicht verwenden, da die gesamten Zeilen nicht identisch sind. nur der Inhalt von Spalte 3.

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

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

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

Dieser Befehl teilt awk mit, welche Zeilen gedruckt werden sollen. Die Variable $3 Enthält den gesamten Inhalt von Spalte 3 und eckige Klammern sind Array-Zugriff. Für jede dritte Zeile der Zeile im Dateinamen wird der Knoten des Arrays mit dem Namen seen inkrementiert und die Zeile gedruckt, wenn der Inhalt dieses Knotens (Spalte 3) zuvor nicht festgelegt wurde (!) .

Der obige Befehl awk funktioniert, wenn Ihre Spalten in der Eingabedatei durch space oder Tab voneinander getrennt sind. Wenn die Spalten durch etwas anderes getrennt sind, müssen Sie es awk mitteilen mit der Option -F. Wenn beispielsweise alle Spalten durch Komma (,) Begrenzt sind und Zeilen basierend auf der dritten Spalte entfernen möchten, verwenden Sie die Option -F','.

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

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

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

Sie könnten sich auf this Antwort beziehen, was darauf hindeutet, dass GNU sort tatsächlich der bessere Ansatz zum Sortieren großer Dateien ist. In Ihrem Fall denke ich sogar ohne -parallel, Sie könnten Ihr Endergebnis ohne große Zeitverzögerung erreichen.

18
Ramesh