Unix-сортировка дает разные результаты для разных пользователей - PullRequest
0 голосов
/ 08 марта 2019

Я хотел отсортировать отчет об имени файлаA со следующим содержанием

pat_int_parallel_all


/projects/test
-v ../../../../../../te
min_custom.v
-v ../../../../../../tes
-y ../../../../../../test_
-y ../../../../../../test_lib/test
../../../../../../tesla
/projects/checklist
../../../../../../test_lib/LIB
../../../../../../telib/av
../../../../../../telib/te
+libext+.v
+incdir+/projectsst_relea/ana

когда я попробовал сортировать -u -r reportA> output. Я получил этот результат

-y ../../../../../../test_lib/test
-y ../../../../../../test_
-v ../../../../../../tes
-v ../../../../../../te 
../../../../../../test_lib/LIB
../../../../../../test 
../../../../../../telib/te
../../../../../../telib/av
/projects/test /projects/checklist 
pat_int_parallel_all min_custom.v
+libext+.v
+incdir+/projectsst_relea/ana

Моя локаль выводится en_US

LANG=en_US
LC_CTYPE="en_US"
LC_NUMERIC="en_US"
LC_TIME="en_US"
LC_COLLATE="en_US"
LC_MONETARY="en_US"
LC_MESSAGES="en_US"
LC_PAPER="en_US"
LC_NAME="en_US"
LC_ADDRESS="en_US"
LC_TELEPHONE="en_US"
LC_MEASUREMENT="en_US"
LC_IDENTIFICATION="en_US"
LC_ALL=

Но для другого пользователя с такой же командой сортировки это привело к другому выводу.

pat_int_parallel_all
min_custom.v
/projects/test
/projects/checklist
../../../../../../test_lib/LIB
../../../../../../tesla
../../../../../../telib/te
../../../../../../telib/av
-y ../../../../../../test_lib/test
-y ../../../../../../test_
-v ../../../../../../tes
-v ../../../../../../te
+libext+.v
+incdir+/projectsst_relea/ana

Вывод локали моих друзей C

LANG=C
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=C 

Мне было интересно, почему обычная команда сортировки uinx дает два разных результата, когда мой псевдоним сортировки, версия SHELL, такой же, как у другого пользователя. Даже настройки cshrc одинаковы. Это из-за специальных символов?

Может кто-нибудь объяснить, что здесь не так.

1 Ответ

1 голос
/ 09 марта 2019

Основной причиной различного поведения sort является значение LC_COLLATE. Выход man 7 locale говорит:

LC_COLLATE

Эта категория определяет правила сортировки, используемые для сортировки и регулярного выражения, включая классы эквивалентности символов и многозначные элементы сортировки. Эта категория локали изменяет поведение функций strcoll(3) и strxfrm(3), которые используются сравнить строки в местном алфавите. Например, немецкий Sharp s сортируется как "ss".

Мой (очень быстрый) анализ sort исходного кода заключается в том, что он преобразует строки текста, которые должны быть отсортированы с помощью strxfrm(), чтобы получить основу сравнения, так что байт строки, которые в противном случае считались бы равными, считаются равными здесь, даже если их байты отличаются (sic).

Относительно того факта, что вы все еще получаете тот же результат, как сказал @Amadan, довольно странно. Вы уверены, что правильно установили локаль? Не могли бы вы попробовать LC_COLLATE="C" sort -ru your_file.

...