сортировка (разность между опцией по умолчанию и числовой опцией -n)

На страницах man мы имеем следующее описание опции –numeric-sort команды sort.

-n, --numeric-sort compare according to string numerical value 

Я полагаю, по строчному числовому значению мы подразумеваем сравнение каждого символа строки последовательно по его значению ASCII?

Информационные страницы читаются

 '-n' '--numeric-sort' '--sort=numeric' Sort numerically. The number begins each line and consists of optional blanks, an optional '-' sign, and zero or more digits possibly separated by thousands separators, optionally followed by a decimal-point character and zero or more digits. An empty number is treated as '0'. The 'LC_NUMERIC' locale specifies the decimal-point character and thousands separator. By default a blank is a space or a tab, but the 'LC_CTYPE' locale can change this. Comparison is exact; there is no rounding error. Neither a leading '+' nor exponential notation is recognized. To compare such strings numerically, use the '--general-numeric-sort' ('-g') option. 

После прочтения обоих документов я до сих пор не вижу явно объясняемого, какой порядок сортировки используется для параметра -n.

Как опция -numeric-sort отличается от значения по умолчанию? Моя наивная догадка заключалась в том, что числа имеют приоритет над буквами, но я не читаю это в документации.

И в какой документации это указано явно, т.е. где я мог бы найти эту информацию, просто просмотрев документацию?

2 Solutions collect form web for “сортировка (разность между опцией по умолчанию и числовой опцией -n)”

По умолчанию sort сортирует символ по символу с использованием заданного порядка сортировки по локали. Как правило, это довольно близко к порядку ASCII, но могут быть некоторые региональные варианты. На странице руководства:

 *** 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. 

Значение собственного байта обычно означает значение ASCII, поэтому цифры поступают до прописных букв, которые поступают до строчных букв. Но упорядочение по-прежнему характерно по характеру, поэтому 10 приходит до 2 потому что 1 до 2 .

Когда --numeric-sort параметр -n или --numeric-sort , пробеги цифр обрабатываются как числа (а не отдельные символы) и сортируются численно от наименьшего числа до наибольшего.

Документация не полностью подробно описана в деталях, поэтому здесь приведены правила флага -n полученные экспериментально:

  1. Линии, которые начинаются численно, сортируются по числовому значению (сначала появляются меньшие числа)
  2. Задние символы в числовых строках не влияют на числовую часть, но конечные символы сортируются буквенно-цифровым образом, если числовая единица совпадает.
  3. Линии, которые начинаются не численно, сортируются так, как если бы они были равны нулю, а затем по правилу 2.

Заметим:

 $ printf %s\\n 2z 111 10 20b 20a aa2 aa10 | sort -n aa10 aa2 2z 10 20a 20b 111 

В соответствии с правилом 3 строки aa10 и aa2 обрабатываются как нули и сортируются по оставшимся символам (включая цифры, которые считаются символами).

В соответствии с правилом 2 строки 2z , 20a и 20b рассматриваются как числа, а завершающий символ вступает в силу только тогда, когда числа совпадают.

И по правилу 1 все строки, начинающиеся с числа, сортируются по числовому значению.

Без флага -n сортировка выполняется символом по символу, где символы цифр поступают перед символами букв. Заметим:

 $ printf %s\\n 2z 111 10 20b 20a aa2 aa10 | sort 10 111 20a 20b 2z aa10 aa2 

Когда у вас многозначные числа, sort -n учитывает все число; по умолчанию файл

 3 2 1 20 30 

Сортируется следующим образом:

 1 2 20 3 30 

вероятно, не то, что вы хотели. С -n вы получаете:

 1 2 3 20 30 

В числовой сортировке также используются отрицательные числа, десятичные точки и разделители тысяч (как определено вашим языковым стандартом). Если есть конец текста «non-number», он игнорируется в порядке сортировки. Если строка начинается с чего-то нечислового, эта строка считается 0.

Точнее, логика такова: ключ (первичный) сортировки является начальной числовой строкой . (То есть «число начинается с каждой строки».) Эта строка определяется как состоящая из возможных пробелов, знака минус, нуля или более цифр и, возможно . и (или что-то еще). Обратные буквы не учитываются – они не являются частью «числа» . Если строка не начинается с цифр, это рассматривается как невидимое («пустое») число, равное 0. (Или «число с нулевыми цифрами»).

Итак, отсортировавшись по «числу» (сравните с помощью -k чтобы дать ключ сортировки), если есть какие-либо оставшиеся строки, эти строки сортируются по умолчанию . (То есть 1a до 1b – и 1a20 до 1a3 .) Вся строка сортируется таким образом, а не строка, кроме ключа сортировки, что дает некоторое нечетное поведение в этом случае ( 0cookies сортирует перед biscuits – для вторичной сортировки, нет «невидимого 0»).

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

Если у вас есть сочетание букв и цифр (и строк, которые содержат оба), вы можете предпочесть -V , который сортирует версию в соответствии со специальными правилами, которые делят строку на логические компоненты, – но будьте осторожны, потому что это 1.10 выше чем 1.9 .

  • Почему запись без номера отображается после «0» при сортировке?
  • Как отсортировать файл по столбцу, представляющему собой сочетание цифр, букв и знаков препинания?
  • Можно сортировать сортировку 1 2 3 4..9 вместо 1 10 11 12 .. 2 20
  • Сортировка по имени?
  • Использование сортировки с алфавитно-цифровыми именами файлов
  • Как удалить повторяющиеся записи из файла?
  • Сортируйте файл, но держите пары строк вместе
  • Unix сортирует память
  • используйте сортировку GNU для сортировки по одному ключу / предотвращения нежелательной сортировки других ключей
  • Как сортировать большие файлы?
  • Получить количество слов в текстовом файле для всех слов и распечатать результат сортировки
  • Linux и Unix - лучшая ОС в мире.