Сортировка по регистру

35

sortУтилита в Ubuntu 10.04 (Lucid) всегда сортировать по нечувствительны к регистру, так же , как если вы укажете --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

Но иногда я хочу сортировать по регистру, поэтому сначала идут заглавные буквы, а затем строчные. Является ли это возможным?

Xiè Jìléi
источник

Ответы:

31

Отменить порядок сопоставления.

echo -e "c\nb\nB\na" | LC_COLLATE=C sort
Игнасио Васкес-Абрамс
источник
5
Это работает, но по определению, только если нет иностранных символов. в игре; они будут сортироваться после 7-битных букв ASCII; попробуй echo $'B\nÄ\nb\na' | LC_COLLATE=C sort. Если не тот факт , что GNU sortс непостоянным Cлокали всегда выполняет сортировку без учета регистра будет считаться ошибкой ?
mklement0
Что касается «иностранных символов», то C.UTF-8locale ( LC_COLLATE=C.UTF-8) будет сортировать с учетом регистра, обрабатывая не-ascii символы UTF-8 «нормально». К сожалению, он недоступен в апстриме в glibc и исправлен только Debian, Ubuntu и производными.
aplaice
13

Интересно, что доступен еще один порядок сортировки:

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

который помещает заглавную букву перед соответствующей строчной буквой.

Вот сравнение их выходных данных (я добавил «d» и «D») в en_US.UTF-8локали (кроме переопределенных):

  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

Выход:

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
Приостановлено до дальнейшего уведомления.
источник
Интересный; Я вижу это поведение в GNU sort v5.93(поставляется с OS X 10.9.3 (!)) И v8.13, но не в v8.21и v8.22. Я думаю, что результаты 2. и 4. все еще можно считать эквивалентными (но это, очевидно, изменится с добавлением иностранных символов).
mklement0