Я всегда предполагал, что sort без каких-либо дополнительных аргументов будет сортировать файл в лексическом порядке. Однако сегодня я наткнулся на следующий тестовый пример:

sort test2.txt
a/a
a/c
a//c
a/d

Как вы можете видеть, третья строка имеет две косые черты, поэтому вторая косая черта находится в месте, где соседние строки имеют буквы «c» и «d» соответственно. Я сомневаюсь, что «/» находится между «c» и «d» в любой кодовой странице, поэтому я предполагаю, что алгоритм сравнения по умолчанию не является строго лексическим.

Есть ли какая-то предварительная обработка (например, удаление не-букв?) или особые случаи (например, "последовательность из одного или нескольких символов равна любой другой последовательности символов"?) для сравнения символов?

Я прочитал man страницу для sort но не нашел там просветления.

я использую

sort --version
sort (GNU coreutils) 8.5
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and Paul Eggert.

и мне действительно нужно сортировать миллионы URL - адреса для дальнейшего анализа , который предполагает лексический порядок - есть какие - либо варианты , которые я мог бы пройти sort , чтобы достичь этого?

1 ответ1

3

Это ваш языковой стандарт, префикс вашей команды сортировки с настройкой языкового стандарта, которая задает порядок сортировки, который вы хотите

$ cat test2.txt
a/d
a/a
a/c
a//c

$ sort test2.txt
a/a
a/c
a//c
a/d

$ LANG=C sort test2.txt
a//c
a/a
a/c
a/d

man sort говорит

   *** WARNING *** The locale specified by the  environment  affects  sort
   order.  Set LC_ALL=C to get the traditional sort order that uses native
   byte values.

GNU говорят

У большинства языковых локалей есть таблицы, которые задают поведение сортировки, чтобы игнорировать пунктуацию и сворачивать регистр. Это противоречит интуитивно понятным для большинства пользователей компьютеров долгое время!


НОТА

Если ваши миллионы URL содержат какие-либо не-ASCII-символы (что делает их фактически IRI), вы можете получить нежелательные результаты, используя сортировку по байтовому значению. Вы можете использовать URL-кодировку, чтобы избежать этой проблемы, рискуя сделать URL-адреса трудными для чтения людьми.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .