Ответы:
Общая числовая сортировка сравнивает числа как числа с плавающей запятой, это позволяет использовать научную нотацию, например, 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 = general-numeric' Произвести числовую сортировку с использованием стандартной функции C strtod для преобразования префикса каждой строки в число с плавающей запятой двойной точности. Это позволяет указывать числа с плавающей запятой в экспоненциальной нотации, например 1.0e-34 и 10e100. Локаль LC_NUMERIC определяет символ десятичной точки. Не сообщайте об ошибках переполнения, недополнения или преобразования. Используйте следующую последовательность сортировки: строки, которые не начинаются с цифр (все считаются равными). NaN (значения «не числа» в арифметике с плавающей запятой IEEE) в согласованном, но машинно-зависимом порядке. Минус бесконечность. Конечные числа в возрастающем числовом порядке (с равными -0 и +0). Плюс бесконечность.
Используйте эту опцию, только если нет альтернативы; он намного медленнее, чем --numeric-sort (-n), и может потерять информацию при преобразовании в числа с плавающей запятой.
'-n' '--numeric-sort' '--sort = numeric' Сортировка в числовом виде. Число начинается с каждой строки и состоит из необязательных пробелов, необязательного знака «-» и нуля или более цифр, которые могут быть разделены разделителями тысяч, за которыми необязательно следует десятичный знак и ноль или более цифр. Пустое число рассматривается как «0». Локаль LC_NUMERIC определяет десятичную точку и разделитель тысяч. По умолчанию пробел - это пробел или табуляция, но языковой стандарт LC_CTYPE может это изменить.
Сравнение точное; ошибки округления нет.
Ни ведущий знак "+", ни экспоненциальное обозначение не распознаются. Чтобы сравнить такие строки численно, используйте параметр --general-numeric-sort (-g).
-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.
В моем случае я использую:
LC_ALL=C sort -k 6,6n file
для сортировки 6-го столбца, который содержит:
2.5
3.7
1.4
чтобы получить
1.4
2.5
3.7
-n
распознать запятую как разделитель тысяч - «1000» обрабатывается так же, как «1».
sort
используется логика самого длинного префикса : используется самая длинная часть строки / ключа, которую он распознает как число; в языковом стандарте, который используется .
в качестве символа основания, он перестанет читать на ,
.
LC_ALL=C
это действительно самый надежный выбор; однако, если LC_ALL
ставка не установлена, LANG=C
тоже сработает.
LANG=C sort -k 6,6n file
он и проще, и локализует эффект установки переменной среды LANG
для конкретной команды.
В дополнение к принятому ответу, в котором упоминается -g
разрешение научных обозначений , я хочу показать ту часть, которая, скорее всего, вызывает нежелательное поведение.
С -g
:
$ LC_COLLATE=fr_FR.UTF-8 LC_NUMERIC=en_US.UTF-8 sort -g myfile
baa
--inf
--inf
--inf-
--inf--
--inf-a
--nnf
nnf--
nnn
tnan
zoo
naN
Nana
nani lol
-inf
-inf--
-11
-2
-1
1
+1
2
+2
0xa
11
+11
inf
Обратите внимание на 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
достаточно:
$ LC_COLLATE=fr_FR.UTF-8 LC_NUMERIC=en_US.UTF-8 sort -n myfile
-1000
-22
-13
-11
-010
-10
-5
-2
-1
-0.2
-0.12
-0.11
-0.1
0x1
0x11
0xb
+1
+11
+2
-a
-aa
--aa
-aaa
-b
baa
BAA
bbb
+ignore
inf
-inf
--inf
--inf
--inf-
--inf--
-inf--
--inf-a
naN
Nana
nani lol
--nnf
nnf--
nnn
None
uum
Zero cool
-zzz
1
1.1
1.234E10
5
11
Либо из, -g
либо -n
, имейте в виду эффект локали . Вы можете указать LC_NUMERIC
as, us_EN.UTF-8
чтобы избежать сбоя сортировки fr_FR.UTF-8 -
с плавающим числом :
$ LC_COLLATE=fr_FR.UTF-8 LC_NUMERIC=fr_FR.UTF-8 sort -n myfile
-10
-5
-2
-1
-1.1
-1.2
-0.1
-0.11
-0.12
-0.2
-a
+b
middle
-wwe
+zoo
1
1.1
С LC_NUMERIC=en_US.UTF-8
:
$ LC_COLLATE=fr_FR.UTF-8 LC_NUMERIC=en_US.UTF-8 sort -n myfile
-10
-5
-2
-1.2
-1.1
-1
-0.2
-0.12
-0.11
-0.1
-a
+b
middle
-wwe
+zoo
1
1.1
Или LC_NUMERIC=us_EN.UTF-8
сгруппировать +|-|space
с alpha
:
$ LC_COLLATE=fr_FR.UTF-8 LC_NUMERIC=us_EN.UTF-8 sort -n myfile
-0.1
a
b
a
b
+b
+zoo
-a
-wwe
middle
1
Вы, вероятно, захотите указать locale
при использовании sort
, хотите ли вы писать переносимый скрипт.
sort
не наman
странице, а наinfo
странице (info sort
).