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

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.


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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.