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 erscheint. 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
Akzeptierte Antwort:
Ändern Sie einfach Ihren awk-Befehl in die Spalte, in der Sie doppelte Zeilen basierend auf dieser Spalte entfernen möchten (in Ihrem Fall dritte Spalte):
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-Zugriffe. Für jede dritte Spalte der Zeile in Dateiname wird also der Knoten des Arrays mit dem Namen seen
wird inkrementiert und die Zeile gedruckt, wenn der Inhalt dieses Knotens (Spalte3) nicht (!
) zuvor festgelegt.
Oben funktioniert es, wenn Ihre Spalten in der Eingabedatei durch Leerzeichen/Tabs getrennt sind, wenn das etwas anderes ist, müssen Sie es mit seinem -F
anweisen, es zu awk Möglichkeit. Wenn also beispielsweise durch Komma getrennte Spalten (,
) und möchte Zeilen basierend auf der dritten Spalte entfernen, verwenden Sie den folgenden Befehl:
awk -F',' '!seen[$3]++' filename