В чем разница между параметрами --general-numeric-sort и --numeric-sort в сортировке gnu - PullRequest
104 голосов
/ 10 августа 2009

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

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

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

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

Ответы [ 2 ]

80 голосов
/ 10 августа 2009

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

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

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

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

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

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

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

10 голосов
/ 12 февраля 2013

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

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

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

LC_ALL=C sort -k 6,6n file

для сортировки 6-го столбца, который содержит:

2.5
3.7
1.4

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

1.4
2.5
3.7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...