GNU sắp xếp theo phân biệt chữ hoa chữ thường


35

Các sorttiện ích trong Ubuntu 10.04 (Lucid) luôn sắp xếp theo case-insensitive, giống như nếu bạn chỉ định --ignore-casevới nó.

The two sort just give the same result: 

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

Nhưng đôi khi tôi muốn sắp xếp theo phân biệt chữ hoa chữ thường, vì vậy các chữ cái viết hoa xuất hiện trước, sau đó là chữ thường. Có thể không?

Câu trả lời:


31

Ghi đè thứ tự đối chiếu.

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

5
Điều này hoạt động, nhưng theo định nghĩa chỉ khi không có ký tự nước ngoài. đang chơi; chúng sẽ sắp xếp sau các chữ cái ASCII 7 bit; thử echo $'B\nÄ\nb\na' | LC_COLLATE=C sort. Không phải thực tế là GNU sortvới một Cngôn ngữ không phải ngôn ngữ luôn luôn thực hiện phân loại theo trường hợp không nhạy cảm được coi là một lỗi ?
mkuity0

Liên quan đến "ký tự nước ngoài", C.UTF-8miền địa phương ( LC_COLLATE=C.UTF-8) sẽ phân loại theo trường hợp nhạy cảm, trong khi xử lý các ký tự UTF-8 không ascii "bình thường". Thật không may, nó không có sẵn ở thượng nguồn trong glibc và chỉ được vá bởi Debian, Ubuntu và các dẫn xuất.
aplaice

13

Thật thú vị, nhưng một thứ tự sắp xếp khác có sẵn như thế này:

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

trong đó đặt chữ cái viết hoa trước chữ cái viết thường tương ứng của nó.

Dưới đây là so sánh kết quả đầu ra của họ (tôi đã thêm "d" và "D") vào en_US.UTF-8miền địa phương (ngoại trừ nơi bị ghi đè):

  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

Đầu ra:

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

Hấp dẫn; Tôi thấy hành vi này trong GNU sort v5.93(đi kèm với OS X 10.9.3 (!)) Và v8.13, nhưng KHÔNG trong v8.21v8.22. Tôi đoán kết quả của 2. và 4. vẫn có thể được coi là tương đương (nhưng điều đó rõ ràng sẽ thay đổi khi thêm các ký tự nước ngoài).
mkuity0
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.