Ich habe eine Datei mit zwei Spalten und 10 Millionen Zeilen. Die erste Spalte enthält viele wiederholte Werte, aber in Spalte 2 gibt es einen eindeutigen Wert. Ich möchte die wiederholten Zeilen entfernen und nur eine verwenden awk
. Hinweis: Die Datei ist nach Werten in Spalte 1 sortiert. Beispiel:
1.123 -4.0
2.234 -3.5
2.234 -3.1
2.234 -2.0
4.432 0.0
5.123 +0.2
8.654 +0.5
8.654 +0.8
8.654 +0.9
.
.
.
.
Erwartete Ausgabe
1.123 -4.0
2.234 -3.5
4.432 0.0
5.123 +0.2
8.654 +0.5
.
.
.
.
sort -buk1,1
Antworten:
Ein paar Möglichkeiten:
awk
Dies ist eine sehr komprimierte Schreibweise:
Wenn sich das aktuelle erste Feld (
$1
) nicht ima
Array befindet, drucken Sie die Zeile und fügen Sie das erste Feld hinzua
. Wenn wir das nächste Mal dieses Feld sehen, befindet es sich im Array und wird daher nicht gedruckt.Perl
oder
Dies ist im Grunde das gleiche wie das
awk
eine. Die-n
Ursachen perl die Eingabedatei Zeile für Zeile zu lesen und das Skript bereitgestellt durch Anwendung-e
auf jeder Zeile. Das-a
teilt automatisch jede Zeile in Leerzeichen und speichert die resultierenden Felder im@F
Array. Schließlich wird das erste Feld zum%k
Hash hinzugefügt, und wenn es noch nicht vorhanden ist, wird die Zeile gedruckt. Das gleiche könnte geschrieben werden alsCoreutils
Diese Methode funktioniert, indem zuerst die Zeilen umgekehrt werden,
file
so dass, wenn eine Zeile 12 345 ist, sie jetzt 543 21 ist. Wir verwenden dannuniq -f 1
, um das erste Feld zu ignorieren, dh die Spalte, in der sich 543 befindet. Es gibt Felder darinfile
. Wenn Sieuniq
hier verwenden, werden doppelte Zeilen herausgefiltert, wobei jeweils nur eine Zeile beibehalten wird. Zuletzt setzen wir die Zeilen mit einer anderen Umkehrung wieder in ihre ursprüngliche Reihenfolge.GNU Art (wie vorgeschlagen von @ StéphaneChazelas)
Das
-b
Flag ignoriert führende Leerzeichen und die-u
Mittelwerte drucken nur eindeutige Felder. Das Schlaue ist das-k1,1
. Das-k
Flag setzt das Feld zum Sortieren. Es nimmt das allgemeine Format an, bei-k POS1[,POS2]
demPOS1
beim Sortieren nur Felder über POS2 betrachtet werden. Also-k1,1
heißt nur auf das 1. Feld schauen. Abhängig von Ihren Daten möchten Sie möglicherweise auch eine der folgenden Optionen hinzufügen:quelle
rev
wird es verwendet ... Danke."
) anstelle von einfachen Anführungszeichen ('
) verwendet?sort -u
legen nahe, dass vorsortierte Daten erheblich schneller sind, ja.Wenn die erste Spalte immer 5 Zeichen lang ist, können Sie einfach Folgendes verwenden
uniq
:Wenn nicht, verwenden Sie
awk
:Der erste wäre definitiv schneller mit einer riesigen Datei.
quelle