GNU sortiert nach Groß- und Kleinschreibung

35

Das sortDienstprogramm in Ubuntu 10.04 (Lucid) sortiert immer nach Groß- und Kleinschreibung, genau wie wenn Sie es angeben --ignore-case.

The two sort just give the same result: 

echo -e "c\nb\nB\na" | sort
echo -e "c\nb\nB\na" | sort --ignore-case

Aber manchmal möchte ich nach Groß- und Kleinschreibung sortieren, sodass zuerst die Groß- und dann die Kleinschreibung erfolgt. Ist es möglich?

Xiè Jìléi
quelle

Antworten:

31

Überschreiben Sie die Sortierreihenfolge.

echo -e "c\nb\nB\na" | LC_COLLATE=C sort
Ignacio Vazquez-Abrams
quelle
5
Dies funktioniert aber per definitionem nur, wenn keine fremden Zeichen vorhanden sind. sind im Spiel; Sie werden nach den 7-Bit-ASCII-Buchstaben sortiert . versuchen Sie es echo $'B\nÄ\nb\na' | LC_COLLATE=C sort. Sollte nicht die Tatsache, dass GNU sortmit einem Nicht- CGebietsschema immer eine case-IN-sensitive Sortierung durchführt, als Fehler angesehen werden ?
mklement0
In Bezug auf "fremde Zeichen" wird bei C.UTF-8locale ( LC_COLLATE=C.UTF-8) zwischen Groß- und Kleinschreibung unterschieden, während Nicht-ASCII-UTF-8-Zeichen "normal" behandelt werden. Leider ist es nicht in glibc verfügbar und wird nur von Debian, Ubuntu und Derivaten gepatcht.
Aplaice
13

Interessanterweise gibt es noch eine andere Sortierreihenfolge:

echo -e "c\nb\nB\na" | LC_COLLATE=C sort --ignore-case

Dies setzt den Großbuchstaben vor den entsprechenden Kleinbuchstaben.

Hier ist ein Vergleich ihrer Ausgaben (ich habe "d" und "D" hinzugefügt) im en_US.UTF-8Gebietsschema (außer wo überschrieben):

  1. echo -e "d\nD\nc\nb\nB\na" | sort
  2. echo -e "d\nD\nc\nb\nB\na" | sort --ignore-case
  3. echo -e "d\nD\nc\nb\nB\na" | LC_COLLATE=C sort
  4. echo -e "d\nD\nc\nb\nB\na" | LC_COLLATE=C sort --ignore-case

Ausgabe:

1   2   3   4
-   -   -   -
a   a   B   a
b   b   D   B
B   B   a   b
c   c   b   c
d   d   c   D
D   D   d   d
Bis auf weiteres angehalten.
quelle
Interessant; Ich sehe dieses Verhalten in GNU sort v5.93(kommt mit OS X 10.9.3 (!)) Und v8.13, aber NICHT in v8.21und v8.22. Ich denke, die Ergebnisse von 2. und 4. können immer noch als gleichwertig angesehen werden (aber das würde sich offensichtlich mit der Hinzufügung von Fremdzeichen ändern).
mklement0