Falsches Verhalten des Sortierbefehls?

14

Ich habe versucht, den Inhalt einer Datei in Ubuntu Desktop 14.04 (Trusty Tahr) zu sortieren . In meinem Fall sollte das erwartete Ergebnis dem ursprünglichen Inhalt entsprechen, das tatsächliche Ergebnis jedoch nicht. Warum?

# cat test.txt
a++-a
a++-b
a++-c
ab
ac
# cat test.txt | sort
a++-a
ab
a++-b
ac
a++-c
user2909884
quelle
4
Ich überreiche Ihnen eine kleine Trophäe für Ihre nutzlose Verwendung voncat .
David Foerster
3
Der Kommentar von @DavidFoerster ist eine lustige Art, darauf hinzuweisen, dass Sie cat test.txt | sortdurch sort test.txt:) ersetzen können
Volker Siegel
@ VolkerSiegel: Stimmt, obwohl es nützliche Formulierungen gibt, mit denen catman anfangen kann. Beispielsweise cat FILE | grep dev | sortwerden nur Zeilen mit "dev" angezeigt (in sortierter Reihenfolge). Verwenden von sort FILE | grep deverzeugt die gleiche Ausgabe, aber farbig.
AlainD

Antworten:

17

Sie könnten LC_ALLVariable verwenden, setzen Sie sie LC_ALL=Cvor dem Aufruf aufsort

$ LC_ALL=C sort test.txt
a++-a
a++-b
a++-c
ab
ac

Lesen Sie diese Antwort, wenn Sie wissen möchten, was das magisch ist LC_ALL=C. Hier ist eine kurze Zusammenfassung:

Das Gebietsschema C ist ein spezielles Gebietsschema, das das einfachste Gebietsschema sein soll. Man könnte auch sagen, dass die anderen Ländereinstellungen für Menschen sind, die Ländereinstellung C jedoch für Computer. Im Gebietsschema C sind Zeichen Einzelbytes, der Zeichensatz ist ASCII, die Sortierreihenfolge basiert auf den Bytewerten.

Auch, wie @KenMollerup zeigte, Zitat aus man sort

   ***  WARNING  ***  The locale specified by the environment affects sort
   order.  Set LC_ALL=C to get the traditional sort order that uses native
   byte values.

Wenn Sie also sort mit verwenden LC_ALL=C, sortieren Sie die Vergleichssymbole nacheinander. Andernfalls sortwerden alle nicht alphanumerischen Zeichen ignoriert.

c0rp
quelle
Sorry habe das nicht gesehen, ich habe auf den Kommentar reagiert!
Ken Mollerup
@ KenMollerup danke für den Hinweis auf man sort. Ich habe es nicht bemerkt
c0rp
8

Sortieren verwendet alphabetische und numerische Sortierung, genau wie wir, Sonderzeichen wie + - <> ... werden ignoriert, Zahlen werden numerisch behandelt, also 1, 2, 3 ... kommt vor 11, 12 1066 1104 - siehe!

Ihre Liste sieht also so aus: aa, ab, ab, ac, ac

Ken Mollerup
quelle
Gibt es eine Sortieroption, mit der Sonderzeichen nicht ignoriert werden, sodass test.txt die gewünschte Sortierung vornimmt?
Doug Smythies
6
Siehe dies in man sort: *** WARNUNG *** Das von der Umgebung angegebene Gebietsschema beeinflusst die Sortierreihenfolge. Setzen Sie LC_ALL = C, um die herkömmliche Sortierreihenfolge abzurufen, die native Bytewerte verwendet.
Ken Mollerup
@ KenMollerup, bitte fügen Sie Ihrer Antwort weitere Informationen hinzu. Zitat man sorthinzufügen von , Beispiele hinzufügen.
c0rp
Ja, aber ich war zu langsam, siehe Antwort von c0rp unten.
Ken Mollerup