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