Який порядок сортування Linux за замовчуванням?


18

Протягом тривалого періоду я вважав, що поведінка sortпрограми за замовчуванням використовує програму ASCII. Однак, коли я ввожу наступні рядки sortбез аргументів:

#
@

Я отримав:

@
#

Але згідно з таблицею ASCII, #це 35 і @становить 64. Інший приклад:

A
a

А вихід:

a
A

Хтось може це пояснити? До речі, що таке "словник-порядок" при використанні sort -d?


5
Порядок сортування залежить від ваших налаштувань мови
січня

2
Але це алфавітний порядок за замовчуванням, принаймні, у сортуванні GNU.
jarno

Відповіді:


17

Схоже, ви використовуєте не-POSIX-локаль.

Спробуйте:

export LC_ALL=C

а потім sort.

info sort чітко говорить:

(1) Якщо ви використовуєте не-POSIX-локаль (наприклад, встановивши "LC_ALL" на "en_US"), то "сортування" може дати результат, який сортується інакше, ніж ви звикли. У цьому випадку встановіть змінну середовища "LC_ALL" на "C". Зауважте, що встановлення лише "LC_COLLATE" має дві проблеми. По-перше, неефективно, якщо також встановлено `LC_ALL '. По-друге, він має невизначене поведінку, якщо для параметра "LC_CTYPE" (або "LANG", якщо "LC_CTYPE" не встановлено) встановлено несумісне значення. Наприклад, ви не визначаєте поведінку, якщо "LC_CTYPE" є "ja_JP.PCK", але "LC_COLLATE" є "en_US.UTF-8".


3
ОП запитує, що таке порядок сортування, а не як його змінити.

1
Дякую, я перевірив на моїй машині та параметри

3

Щоб визначити порядок сортування, просто створіть файл із різним символом у кожному рядку та сортуйте його. Отриманий результат підкаже вам порядок сортування.


Приємно, просто та ефективно

1
Взагалі дуже гарна ідея, але її не завжди достатньо. Порівнювання не потрібно визначати лише для окремих символів. Деякі зіставлення трактують "ае" так, ніби це лігатура, або розглядають лігатури так, ніби вони розкладаються. Інший випадок полягає в тому, що багато зіставлень трактують "a" і "A" як однакові, але порядок, який ви бачите при тестуванні, не говорить вам про це (може сказати вам, чи стабільний сорт). І тест з одним символом не вказує, чи є розширення вкладки, нормалізація пробілів тощо. Тим не менш, це дуже вдале місце для початку.
TextGeek

1
(занадто пізно для редагування попереднього коментаря) - якщо ви фактично включаєте достатньо різноманітний діапазон символів, ви можете повідомити про ігнорування випадків, якщо побачити (наприклад) aAbB замість abAB.
TextGeek

2

Як man sortговориться, "порядок словника" означає "враховувати лише пробіли та буквено-цифрові символи". Наприклад, з урахуванням даних

The
!quick
brown
@fox
jumps
#over
17
$lazy
  dogs
%42
times.

команда без прихильності sortвиробляє

  dogs
!quick
#over
$lazy
%42
@fox
17
brown
jumps
The
times.

(Введення рядка , які починаються з символами пробілу і !, #, $, %і @символами 1 попереду рядків , які починаються з буквами і цифрами, тобто буквено - цифрові символи ), але sort -dвиробляє

  dogs
17
%42
brown
@fox
jumps
$lazy
#over
!quick
The
times.

  dogsвсе-таки перше, тому що воно починається з пробілів, але спеціальні (пунктуаційні) символи ігноруються.  17передує 42, і foxприходить між brownі jumps, незважаючи на те , що 42і foxє символи перед ними , які , як правило , перемістити їх до 17.
____________
1 у порядку їх значень ASCII: простір = 040, != 041, #= 043, $= 044, %= 045 і @= 0100. Зауважте, що (не враховуючи пробіл), це приблизно порядку зліва направо на деяких клавіатурах.


1
Порядок у вашому першому прикладі, коли текст сортується спочатку за пунктуацією, може призвести до того, що локальний код, що діє, є C (як у LC_ALL = C), але не в інших мовах. Який локальний код за замовчуванням залежить від параметрів ОС. Отже, неприхований sort має бути різним у багатьох дистрибутивах.
Ісаак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.