Hier sind Befehle für eine zufällige Datei aus dem Pastebin :
wget -qO - http://pastebin.com/0cSPs9LR | wc -l
350
wget -qO - http://pastebin.com/0cSPs9LR | sort -u | wc -l
287
wget -qO - http://pastebin.com/0cSPs9LR | sort | uniq | wc -l
287
wget -qO - http://pastebin.com/0cSPs9LR | sort | uniq -u | wc -l
258
In den Manpages ist nicht klar, was die -u
Flagge tut. Irgendein Rat?
Antworten:
Kurzfassung:
uniq
Ohne-u
macht jede Zeile der Ausgabe einzigartig.uniq -u
druckt nur jede einzelne Zeile aus der Eingabe .Etwas längere Version:
uniq
Dient zum Behandeln von Dateien, deren Zeilen dupliziert wurden, und nur dann, wenn diese Zeilen nacheinander in der Eingabe erscheinen. Aus diesem Grund ist eine eindeutige Zeile eine Zeile, die nicht sofort dupliziert wird.(
uniq
hat ein sehr begrenztes Kurzzeitgedächtnis; es wird sich nie daran erinnern, ob eine Zeile früher in der Eingabe erschienen ist, es sei denn, es war die unmittelbar vorhergehende Zeile - aus diesem Grunduniq
wird sie sehr oft gepaartsort
.)Wenn es auf eine Reihe doppelter Zeilen stößt,
uniq
wird ohne das-u
Argument eine Kopie dieser Zeile gedruckt . (Es macht jede Zeile der Ausgabe einzigartig ).Mit dem
-u
Argument werden keine Kopien dieser Zeile ausgegeben - Dublettenfolgen werden einfach in der Ausgabe weggelassen.quelle
sort -u
statt verwendensort | uniq
.uniq
Normalisierung und Sortierung ausführt , ja. Aber selbst dann ist es nur eine lokale Überlegung - Sie wissen, wo in der sortierten Ausgabe die Zeile erscheint, und müssen nur auswählen, welche von mehreren benachbarten Zeilen beibehalten werden soll. Wenn die Eingabe nicht sortiert ist, wirkt sich die Entscheidung auf den gesamten Vorgang der Vereinheitlichung aus. Wenn Sie beispielsweise das letzte Duplikat behalten, können Sie erst dann etwas ausgeben, wenn Sie die letzte Zeile der Eingabe gelesen haben ...uniq
mit werden-u
alle doppelt vorhandenen Zeilen übersprungen. Somit:Normalerweise werden
uniq
Zeilen höchstens einmal gedruckt (bei sortierter Eingabe). Diese Option druckt tatsächlich Zeilen, die wirklich einzigartig sind (nicht mehr aufgetaucht sind).quelle
uniq
könnte aufgerufen werdendistinct
, da alle unterschiedlichen Zeilenuniq -u
gedruckt werden, während alle eindeutigen Zeilen gedruckt werden.uniq
.uniq POSIX spec hat es klar beschrieben:
-u
Option machenuniq
, um wiederholte Zeilen nicht zu drucken.Die meisten
uniq
Implementierungen verwendeten den Byte-Vergleich, während GNUuniq
die Sortierreihenfolge verwendete, um doppelte Zeilen zu filtern. So kann es in einigen Gebietsschemas zu falschen Ergebnissen kommen, zum Beispiel imen_US.UTF-8
Gebietsschema:und
-u
gab dir keine Zeilen:Deshalb sollten Sie das Gebietsschema auf setzen
C
, um einen Byte-Vergleich zu erhalten:quelle
uniq
(obwohl POSIX anscheinend die Absicht hatte, einen Byte-Vergleich anstelle von strcoll () als in durchzuführen), wie dies beisort -u
Gebietsschemata der Fall ist, bei denen ① fälschlicherweise wie ② sortiert wird. Zumindest ist GNUuniq
konsistent mitsort -u
.uniq
erforderlich, um memcmp / strcmp im Gegensatz zu strcoll zu tun, ist das für mich nicht sehr offensichtlich, aber das war für Geoff . Bezüglich der GNU-Gebietsschemata, in denen ① wie ② sortiert ist, ist dies eindeutig ein Fehler, da es keinen Grund gibt, warum sie gleich sortiert werden sollten. Das ist von POSIX erlaubt, aber es gibt einige Änderungen .normal:
uniq: keine zwei aufeinanderfolgenden sich wiederholenden Zeilen
sortiert
sort -u: keine zwei sich wiederholenden Zeilen
sort / uniq: alle verschieden
zählt verschiedene Vorkommen
nur Zeilen, die nicht wiederholt werden (nicht zuerst sortiert)
nur Zeilen, die nicht wiederholt werden (nach dem Sortieren)
uniq -d: druckt nur doppelte Zeilen, eine für jede Gruppe
.. gezählt
quelle