GNU urutkan berdasarkan case-sensitive

35

The sortutilitas di Ubuntu 10.04 (Lucid) selalu Urut berdasarkan kasus-sensitif, seperti jika Anda menentukan --ignore-caseuntuk itu.

The two sort just give the same result: 

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

Tetapi kadang-kadang saya ingin menyortir berdasarkan huruf besar-kecil, jadi huruf besar datang lebih dulu, kemudian huruf kecil. Apa itu mungkin?

Xiè Jìléi
sumber

Jawaban:

31

Timpa urutan pemeriksaan.

echo -e "c\nb\nB\na" | LC_COLLATE=C sort
Ignacio Vazquez-Abrams
sumber
5
Ini berfungsi, tetapi menurut definisi hanya jika tidak ada karakter asing. sedang bermain; mereka akan mengurutkan setelah surat ASCII 7-bit; coba echo $'B\nÄ\nb\na' | LC_COLLATE=C sort. Bukankah fakta bahwa GNU sortdengan non- Clokal selalu melakukan penyortiran case-INsensitive dianggap sebagai bug ?
mklement0
Mengenai "karakter asing", C.UTF-8locale ( LC_COLLATE=C.UTF-8) akan mengurutkan huruf besar-kecil, sambil memperlakukan karakter UTF-8 non-ascii "normal". Sayangnya, itu tidak tersedia di hulu di glibc dan hanya ditambal oleh Debian, Ubuntu dan turunannya.
aplaice
13

Menariknya, belum ada pemesanan jenis lain yang tersedia seperti ini:

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

yang menempatkan huruf besar sebelum huruf kecil yang sesuai.

Berikut ini adalah perbandingan dari output mereka (saya menambahkan "d" dan "D") di en_US.UTF-8lokal (kecuali di mana ditimpa):

  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

Keluaran:

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
Dijeda sampai pemberitahuan lebih lanjut.
sumber
Menarik; Saya melihat perilaku ini di GNU sort v5.93(dilengkapi dengan OS X 10.9.3 (!)) Dan v8.13, tetapi TIDAK di v8.21dan v8.22. Saya kira hasil 2. dan 4. masih bisa dianggap setara (tapi itu jelas akan berubah dengan penambahan karakter asing).
mklement0