Назад | Перейти на главную страницу

сортировка unix обрабатывает символы '-' (тире) как невидимые

файл со строками (aa ac a-b) unix сортирует до (aa a-b ac) вместо ожидаемого (a-b aa ac)

это как будто sort игнорирует символ '-'.

Интересно, что дефис сам по себе отсортирован правильно (a b c -) сортируется в (- a b c).

Зачем? как-нибудь изменить это поведение?

Поведение порядка сортировки сортировать (1) контролируется настройками вашего региона (см. man locale).

Существует ряд различных настроек локали, например:

$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
...
LC_ALL=

Чтобы выбрать желаемое поведение сортировки, вам необходимо выбрать правильное значение LC_COLLATE. В этом случае подойдет стандартная встроенная локаль C (POSIX):

$ sort testcase
aa
a-b
ac

$ LC_COLLATE=C sort testcase
a-b
aa
ac

При желании вы можете установить все настройки локали (чтобы они были более согласованными), установив LC_ALL = C. Поскольку это переменные среды, вы можете навсегда установить порядок сортировки с помощью export LC_ALL=C или что-то подобное в сценарии запуска оболочки.

установка переменной среды LC_ALL = C изменяет поведение сортировки. Порядок сортировки локали по умолчанию должен обрабатывать "-" специально.