не могу объяснить поведение sort(1)

Я был озадачен этим, когда увидел следующие файлы, перечисленные ls в странном порядке:

Star Wars Episode II - Attack of the Clones (2002) BDRip.mkv
Star Wars Episode III - Revenge of the Sith (2005) BDRip.mkv
Star Wars Episode I - The Phantom Menace (1999) BDRip.mkv
Star Wars Episode IV - A New Hope (1977) BDRip.mkv
Star Wars Episode VI - Return of the Jedi (1983) BDRip.mkv
Star Wars Episode V - The Empire Strikes Back (1980) BDRip.mkv

С человеческой точки зрения, сначала должно идти «I», затем «II» и так далее.

поэтому я создал файл со следующим содержимым:

$ cat 1
Star Wars Episode II - Attack
Star Wars Episode III - Revenge
Star Wars Episode I - The
Star Wars Episode IV - A
Star Wars Episode VI - Return
Star Wars Episode V - The

если я сортирую это, это дает мне это:

$ sort 1
Star Wars Episode II - Attack
Star Wars Episode III - Revenge
Star Wars Episode I - The
Star Wars Episode IV - A
Star Wars Episode VI - Return
Star Wars Episode V - The

Однако, если я удалю '-' и все после этого отсортируется правильно:

$ cat 1
Star Wars Episode II 
Star Wars Episode III 
Star Wars Episode I 
Star Wars Episode IV 
Star Wars Episode VI 
Star Wars Episode V 

$ sort 1
Star Wars Episode I 
Star Wars Episode II 
Star Wars Episode III 
Star Wars Episode IV 
Star Wars Episode V 
Star Wars Episode VI 

Итак, как только я добавляю любой символ после пробела, он начинает непредсказуемо сортировать для меня:

$ cat 1
Star Wars Episode II y
Star Wars Episode III x
Star Wars Episode I z
Star Wars Episode IV w
Star Wars Episode VI v
Star Wars Episode V u

$ sort 1
Star Wars Episode III x
Star Wars Episode II y
Star Wars Episode IV w
Star Wars Episode I z
Star Wars Episode VI v
Star Wars Episode V u

Какой-нибудь намек на такое поведение?

Обновление: сортировка: с использованием правил сортировки en_CA.UTF-8.

обновление №2 согласно комментарию ниже, это из-за локали.

ls | LANG=C sort
Star Wars Episode I - The Phantom Menace (1999) BDRip.mkv
Star Wars Episode II - Attack of the Clones (2002) BDRip.mkv
Star Wars Episode III - Revenge of the Sith (2005) BDRip.mkv
Star Wars Episode IV - A New Hope (1977) BDRip.mkv
Star Wars Episode V - The Empire Strikes Back (1980) BDRip.mkv
Star Wars Episode VI - Return of the Jedi (1983) BDRip.mkv

Почему тогда локаль UTF8 делает ее другой? Проверил с ru_RU.UTF8 (неправильная сортировка) и ru_RU.KOI8-R (правильная сортировка)

Обновление №3. Речь идет о локали: http://www.gnu.org/software/coreutils/faq/#Sort-does-not-sort-in-normal-order_0021


person stimur    schedule 05.12.2013    source источник
comment
Добавление LC_ALL=C заставляет его работать, поэтому оно должно иметь какое-то отношение к локали.   -  person Ramchandra Apte    schedule 05.12.2013
comment
unix.com/showthread.php?t=156805 скрипты для сортировки файлов с римские цифры   -  person andrybak    schedule 05.12.2013
comment
Является ли ii орграфом в локали ru_RU, который сортируется перед i (когда он не считается римской цифрой)? Быстрый поиск в Google показывает, что сообщалось об ошибках в локали ru_RU.UTF8 для проблем с порядком сопоставления, так что вполне возможно, что это часть того, что вы видите...   -  person twalberg    schedule 05.12.2013
comment
Пожалуйста, посмотрите на мой ответ ниже и обновите исходный вопрос. Это поведение по умолчанию для локалей UTF8, по крайней мере, для тех, с которыми я работал. Они игнорируют пробелы. Моя первоначальная проблема была связана не с локалью ru.RU.*, а с *.UTF8 вообще и en_CA.UTF8 в частности.   -  person stimur    schedule 05.12.2013


Ответы (2)



Он игнорирует все символы, отличные от буквенно-цифровых, при использовании сортировки на основе локали:

II - Attack   -> "IIA"
III - Revenge -> "III"
I - The       -> "ITh"
IV - A        -> "IVA"
VI - Return   -> "VIR"
V - The       -> "VTh"

С LC_ALL=C символ пробела сортируется перед буквенно-цифровым:

I - The       -> "I -"
II - Attack   -> "II "
III - Revenge -> "III"
IV - A        -> "IV "
V - The       -> "V -"
VI - Return   -> "VI "

Так что это совпадение, что это работает, но требуется еще 30 фильмов, чтобы это действительно провалилось.

person Simon Richter    schedule 05.12.2013
comment
Да спасибо. поправочка: насколько я вижу, это только локали UTF8. - person stimur; 05.12.2013