Überall, wo ich jemanden sehe, der eine sortierte, eindeutige Liste benötigt, wird er immer weitergeleitet sort | uniq
. Ich habe noch nie Beispiele gesehen, bei denen jemand sort -u
stattdessen verwendet. Warum nicht? Was ist der Unterschied und warum ist es besser, uniq als die eindeutige Kennzeichnung zum Sortieren zu verwenden?
120
Antworten:
sort | uniq
gab es schon frühersort -u
und ist mit einer Vielzahl von Systemen kompatibel, obwohl fast alle modernen Systeme dies unterstützen-u
- es ist POSIX. Es ist vor allem eine Reminiszenz an die Tage , wennsort -u
nicht existiert (und die Menschen nicht dazu neigen , ihre Methoden zu ändern , wenn die Art und Weise , dass sie wissen , weiter zu arbeiten, schauen Sie sichifconfig
gegenip
Adoption).Die beiden wurden wahrscheinlich zusammengeführt, da das Entfernen von Duplikaten in einer Datei eine Sortierung erfordert (zumindest im Standardfall) und ein äußerst häufiger Anwendungsfall ist. Es ist auch intern schneller, da beide Vorgänge gleichzeitig ausgeführt werden können (und weil zwischen
uniq
und kein IPC erforderlich istsort
). Insbesondere wenn die Datei groß ist,sort -u
werden wahrscheinlich weniger Zwischendateien zum Sortieren der Daten verwendet.Auf meinem System erhalte ich durchweg folgende Ergebnisse:
Es maskiert auch nicht den Rückkehrcode von
sort
, was möglicherweise wichtig ist (in modernen Shells gibt es Möglichkeiten,bash
das$PIPESTATUS
Array zu ermitteln, aber das stimmte nicht immer).quelle
sort | uniq
weil ich 9 mal von 10 tatsächlich anpfeifeuniq -c
.sort -u
Teil der 7. Ausgabe von UNIX, circa 1979, war. Versionensort
ohne Unterstützung für-u
sind wirklich archaisch - oder wurden ohne Berücksichtigung des De-facto-Standards vor dem De-jure-Standard von POSIX geschrieben. Siehe auch Stack Overflow Sort & uniq in der Linux-Shell von 2010.ip
. Es ist 2016 und dieser Beitrag im Jahr 2013, aber ich weißip
jetzt nur über Befehl.uniq -c
" (und vielleicht noch einmal für "sort -nr | head
). Ich habe mich gefragt, wassort | uniq
Vim entspricht, als ich herausfand, dass Vim das:sort u
Kommando hat. Und TILsort -u
gibt es auch.sort -n | uniq
vs. einen Unterschied gibtsort -n -u
. Zum Beispiel werden abschließende und führende Leerzeichensort -n -u
von ersteren als Duplikate angesehen, aber nicht von diesen!echo -e 'test \n test' | sort -n -u
gibt zurücktest
, gibt aberecho -e 'test \n test' | sort -n | uniq
beide Zeilen zurück.Ein Unterschied besteht darin, dass
uniq
es eine Reihe nützlicher zusätzlicher Optionen gibt, z. B. das Überspringen von Feldern zum Vergleichen und das Zählen der Anzahl der Wiederholungen eines Werts.sort
Das-u
Flag von implementiert nur die Funktionalität des schmucklosenuniq
Befehls.quelle
sort -u
kann nicht übergeben werdenuniq
, um einige der nützlichen Optionen des letzteren zu verwenden, wie zum Beispiel das Überspringen von Feldern zum Vergleichen und Zählen der Anzahl von Wiederholungen."Bei POSIX-kompatiblen
sort
s unduniq
s (GNUuniq
ist derzeit in dieser Hinsicht nicht kompatibel) gibt es einen Unterschied darin, dasssort
der Sortieralgorithmus des Gebietsschemas zum Vergleichen von Zeichenfolgen verwendet wird (wird normalerweisestrcoll()
zum Vergleichen von Zeichenfolgen verwendet), währenduniq
auf Byte-Wert-Identität geprüft wird (wird normalerweise verwendetstrcmp()
). .Das ist aus mindestens zwei Gründen wichtig.
In einigen Gebietsschemata, insbesondere auf GNU-Systemen, gibt es verschiedene Zeichen, die gleich sortiert sind. Im Gebietsschema en_US.UTF-8 auf einem GNU-System sortieren beispielsweise alle Zeichen ①②③④⑤⑥⑦⑧⑨⑩ ... und viele andere gleich, da ihre Sortierreihenfolge nicht definiert ist. Die arabischen Ziffern 0123456789 sortieren sich wie die ostarabischen indischen Ziffern (٠١٢٣٤٥٦٧٨٩).
Denn
sort -u
① sortiert das Gleiche wie ② und 0123 das Gleiche wie ٠١٢٣, sosort -u
dass nur eines von jedem erhalten bleibt , während füruniq
(nicht GNUuniq
, dasstrcoll()
(außer mit-i
) verwendet) ① von ② verschieden ist und 0123 von ٠١٢٣ verschieden ist, alsouniq
alle berücksichtigen würden 4 einzigartig.strcoll
kann nur Zeichenfolgen gültiger Zeichen vergleichen (das Verhalten ist gemäß POSIX nicht definiert, wenn die Eingabe Sequenzen von Bytes enthält, die keine gültigen Zeichen bilden), während Zeichenstrcmp()
keine Rolle spielen, da nur ein Byte-zu-Byte-Vergleich durchgeführt wird. Dies ist ein weiterer Grund, warum Siesort -u
möglicherweise nicht alle eindeutigen Zeilen erhalten, wenn einige von ihnen keinen gültigen Text bilden.sort|uniq
In der Praxis ist es wahrscheinlicher, dass Sie aus diesem Grund eindeutige Zeilen erhalten, obwohl dies bei der Nicht-Texteingabe noch nicht festgelegt ist.Abgesehen von diesen Feinheiten wurde bisher noch nicht bemerkt, dass
uniq
die gesamte Zeile lexikalisch verglichen wird, währendsort
der-u
Vergleich auf der Grundlage der in der Befehlszeile angegebenen Sortierspezifikation erfolgt.quelle
Ich bevorzuge die Verwendung,
sort | uniq
da-u
es nicht so einfach ist, das Ergebnis zu verstehen, wenn ich versuche, mit der Option (Duplikate entfernen) Duplikate mit gemischten Groß- / Kleinschreibung zu entfernen.Hinweis: Bevor Sie die folgenden Beispiele ausführen können, müssen Sie die Standard-C-Sortierfolge folgendermaßen simulieren:
Zum Beispiel, wenn ich eine Datei sortieren und Duplikate entfernen möchte, während gleichzeitig die verschiedenen Fälle von Zeichenfolgen getrennt bleiben.
Diese Verwirrung wird behoben, indem die
-u
Option zum Entfernen von Duplikaten nicht verwendet wird. Verwendenuniq
ist vorhersehbarer. Das Folgende sortiert und ignoriert zuerst den Fall und übergibt ihn dann anuniq
, um die Duplikate zu entfernen.quelle
-u
Möglichkeit,sort
den ersten eines gleichen Laufs auszugeben (siehe Manpage). Sosort -fu
nimmt das erste Auftreten eines jeden Fall unempfindliche einzigartigen Line - Up. Die Logiksort
zum Entfernen von Duplikaten ist vorhersehbar.Ein weiterer Unterschied, den ich heute herausgefunden habe, besteht darin, dass beim Sortieren nach einem Delimeter
sort -u
die eindeutige Markierung nur für die Spalte angewendet wird, nach der Sie sortieren.quelle