Какая разница между параметрами --general-numeric-sort и -numeric-sort в сортировке gnu

sort предоставляет два типа числовой сортировки. Это со страницы man:

   -g, --general-numeric-sort
          compare according to general numerical value

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

Какая разница?

Ответ 1

Общая цифровая сортировка сравнивает числа как float, это позволяет использовать научную нотацию, например, 1.234E10, но медленнее и подвержена ошибке округления (1.2345678 может появиться после 1.2345679), числовая сортировка - это просто обычный алфавитный вид, который знает, что 10 приходит после 9.

См. http://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html

'- g' - общий-цифровой-сортировать '--sort = general-numeric Sort численно, используя стандарт C функция strtod для преобразования префикса каждая строка с двойной точностью число с плавающей запятой. Это позволяет числа с плавающей запятой в научной нотации, например, 1.0e-34 и 10e100. LC_NUMERIC locale определяет десятичную точку персонаж. Не сообщайте о переполнении, ошибок при переполнении или преобразовании. использование следующая последовательность сортировки: Строки, которые не начинаются с цифр (все считаются равными). NaNs (Значения "не числа" в IEEE арифметика с плавающей запятой) в непротиворечивые, но машино- заказ. Минус-бесконечность. конечный номера в возрастающем числовом порядке (с -0 и +0 равными). плюс бесконечность.

Используйте этот параметр только в том случае, если нет альтернатива; он намного медленнее, чем --numeric-sort (-n), и он может потерять информацию при преобразовании в плавающая точка.

'- n' --numeric-sort '--sort = numeric Сортировать численно. Номер начинается каждая строка и состоит из необязательного пробелы, необязательный знак - и нуль или больше цифр, возможно, разделенных тысячи разделителей, опционально за которым следует знак десятичной точки и ноль или более цифр. Пустое номер обрабатывается как "0". LC_NUMERIC locale определяет десятичный знак и тысячи разделитель. По умолчанию пробел является пробел или вкладку, но LC_CTYPE locale может изменить это.

Сравнение точное; здесь нет ошибка округления.

Ни ведущая '+, ни экспоненциальная нотация распознается. Сравнивать таких строк, используя --general-numeric-sort (-g).

Ответ 2

Вы должны быть осторожны с вашим языком. Например, вы можете намереваться сортировать плавающее число (например, 2.2), тогда как ваш язык может ожидать использование запятой (например, 2,2).

Как сообщается в этот форум, вы можете ошибаться, используя флаги -n или -g.

В моем случае я использую:

LC_ALL=C sort -k 6,6n file

чтобы отсортировать шестой столбец, содержащий:

2.5
3.7
1.4

чтобы получить

1.4
2.5
3.7