sort
предоставляет два вида числовой сортировки. Это со страницы руководства:
-g, --general-numeric-sort
compare according to general numerical value
-n, --numeric-sort
compare according to string numerical value
Какая разница?
sort
не наman
странице, а наinfo
странице (info sort
).Ответы:
Общая числовая сортировка сравнивает числа как числа с плавающей запятой, это позволяет использовать научную нотацию, например, 1.234E10, но работает медленнее и подвержена ошибкам округления (1.2345678 может идти после 1.2345679), числовая сортировка - это обычная буквенная сортировка, которая знает, что 10 идет после 9.
См. Http://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html
источник
-k3.2n
или-k3.2g
, он выполняет сортировкуR10
раньшеR2
. Сортировка лексикографическая, а не числовая. Я ожидаю, что он будет рассматривать поле, начиная со второго символа, как число.sort
ключевые характеристики. действительно византийские - вкратце: пробелы перед полем считаются частью поля , поэтому char. index 1 указывает на (первый) пробел перед полем, а не на фактический первый символ поля. Добавьте суффикс к символу. index с помощью,b
чтобы исправить эту проблему, то есть:-k 3.2bn,3
(обратите внимание, что глобальная-b
опция в этом случае не работает). Также обратите внимание на добавленное,3
, которое гарантирует, что используется только 3-е поле - без этого индекса 2-го поля используется остаток от всей строки .Вы должны быть осторожны с вашим регионом. Например, вы можете намереваться отсортировать плавающее число (например, 2.2), тогда как в вашем языковом стандарте может ожидаться использование запятой (например, 2,2).
Как сообщается на этом форуме , вы можете получить неверные результаты, используя флаги -n или -g.
В моем случае я использую:
для сортировки 6-го столбца, который содержит:
чтобы получить
источник
-n
распознать запятую как разделитель тысяч - «1000» обрабатывается так же, как «1».sort
используется логика самого длинного префикса : используется самая длинная часть строки / ключа, которую он распознает как число; в языковом стандарте, который используется.
в качестве символа основания, он перестанет читать на,
.LC_ALL=C
это действительно самый надежный выбор; однако, еслиLC_ALL
ставка не установлена,LANG=C
тоже сработает.LANG=C sort -k 6,6n file
он и проще, и локализует эффект установки переменной средыLANG
для конкретной команды.В дополнение к принятому ответу, в котором упоминается
-g
разрешение научных обозначений , я хочу показать ту часть, которая, скорее всего, вызывает нежелательное поведение.С
-g
:Обратите внимание на
zoo
три важных момента:Строка начинается с
NAN
(например,Nana
иnani lol
) или-INF
(одиночное тире, не--INF
) перемещается в конец, но перед цифрами. ПокаINF
переходите к последней цифре после цифр, потому что это означает бесконечность .NAN
,INF
И-INF
это чувствительно к регистру .Линии всегда игнорируют пробелы с обеих сторон
NAN
,INF
,-INF
(независимо отLC_CTYPE
). Другой алфавит может игнорировать пробелы с любой стороны в зависимости от языкового стандартаLC_COLLATE
(например,LC_COLLATE=fr_FR.UTF-8
игнорировать, ноLC_COLLATE=us_EN.UTF-8
не игнорировать).Поэтому, если вы сортируете произвольные буквенно-цифровые символы, вам, вероятно, не нужно
-g
. Если вам действительно нужно сравнение с научной нотацией-g
, то вы, вероятно, захотите извлечь алфавитные и числовые данные и провести сравнение отдельно .Если вам нужна только обычная
1, -1
сортировка чисел (например ) и вы чувствуете, что это0x/E/+ sorting
не важно, просто используйте-n
достаточно:Либо из,
-g
либо-n
, имейте в виду эффект локали . Вы можете указатьLC_NUMERIC
as,us_EN.UTF-8
чтобы избежать сбоя сортировки fr_FR.UTF-8-
с плавающим числом :С
LC_NUMERIC=en_US.UTF-8
:Или
LC_NUMERIC=us_EN.UTF-8
сгруппировать+|-|space
сalpha
:Вы, вероятно, захотите указать
locale
при использованииsort
, хотите ли вы писать переносимый скрипт.источник