Sie können den Befehl sort
mit der folgenden Option verwenden --unique
:
sort -u input-file
Wenn Sie das Ergebnis anstelle der Standardausgabe in die DATEI schreiben möchten, verwenden Sie die folgende Option --output=FILE
:
sort -u input-file -o output-file
Der Befehl kann uniq
auch angewendet werden. In diesem Fall müssen die identischen Zeilen folgen , daher muss die Eingabe vorläufig sortiert werden - danke an @RonJohn für diesen Hinweis:
sort input-file | uniq > output-file
Ich mag den sort
Befehl für ähnliche Fälle wegen seiner Einfachheit, aber wenn Sie mit großen Arrays arbeiten, könnte der awk
Ansatz aus der Antwort von John1024 leistungsfähiger sein. Hier ist ein Zeitvergleich zwischen den genannten Ansätzen, der auf eine Datei (basierend auf dem obigen Beispiel) mit fast 5 Millionen Zeilen angewendet wird:
$ cat input-file | wc -l
20000000
$ TIMEFORMAT=%R
$ time sort -u input-file | wc -l
64
7.495
$ time sort input-file | uniq | wc -l
64
7.703
$ time awk '!a[$0]++' input-file | wc -l # from John1024's answer
64
1.271
$ time datamash rmdup 1 < input-file | wc -l # from αғsнιη's answer
64
0.770
Ein weiterer wesentlicher Unterschied ist der von @Ruslan erwähnte :
sort -u
druckt das Ergebnis erst, wenn die Eingabe beendet ist, während dieser awk
Befehl jede neue Ergebniszeile im laufenden Betrieb druckt (dies ist möglicherweise wichtiger für Pipeline-Eingaben als für Dateien).
Hier ist eine Illustration:
Im obigen Beispiel erzeugt die Schleife (unten gezeigt) 500 zufällige Kombinationen der Buchstaben AD mit einer Länge von jeweils drei Zeichen. Diese Kombinationen werden an awk
oder weitergeleitet sort
.
for i in {1..500}; do cat /dev/urandom | tr -dc A-D | head -c 3; echo; done
sort input-file | uniq
!!!!Wenn Sie die Ausgabezeilen in derselben Reihenfolge wie die Eingabezeilen halten möchten, verwenden Sie:
Wie es funktioniert:
Dies verwendet ein assoziatives Array, um
a
zu zählen, wie oft jede Zeile zuvor gesehen wurde. Wenn es vorher nicht gesehen wurde, wird die Zeile gedruckt.quelle
awk
, aber essort -u
ist der einfache Weg.sort -u
auch der langsamste Weg :) Ich habe meine Antwort mit einem Zeitvergleich zwischen den beiden Ansätzen aktualisiert.sort -u
wird das Ergebnis erst gedruckt, wenn die Eingabe beendet ist, während dieserawk
Befehl jede neue Ergebniszeile im laufenden Betrieb druckt (dies ist möglicherweise wichtiger für die Weiterleitung als für die Datei).awk
Lösung sehr gut ist, wenn auch nicht so einfach zu lesen wiesort
.Sie können GNU
datamash
hier auch wie folgt verwenden und behalten die Zeilenreihenfolge bei.quelle
time
Vergleich ist dies die schnellste Lösung, die hier angeboten wird.