Каково различие между использованием sort
команда с -g
и -n
?
Я попробовал оба флага ls -la
и вывод был идентичен.
В странице справочника говорится это -g
"выдерживает сравнение согласно общему численному значению" и -n
"выдерживает сравнение согласно строковому численному значению"?
Я не получаю то, что они имеют в виду там.
Что делает "общее численное значение", среднее? Что действительно "представляет в виде строки численное значение", среднее?
От sort
информационная страница, вид -g
объяснен этими
‘-g’
‘--general-numeric-sort’
‘--sort=general-numeric’
Sort numerically, converting a prefix of each line to a long
double-precision floating point number. *Note Floating point::.
Do not report overflow, underflow, or conversion errors. Use the
following collating sequence:
• Lines that do not start with numbers (all considered to be
equal).
• NaNs (“Not a Number” values, in IEEE floating point
arithmetic) in a consistent but machine-dependent order.
• Minus infinity.
• Finite numbers in ascending numeric order (with -0 and +0
equal).
• Plus infinity.
Use this option only if there is no alternative; it is much slower
than ‘--numeric-sort’ (‘-n’) and it can lose information when
converting to floating point.
sort -n
, естественный вид, который мы обычно ожидаем
‘-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.
Проверка ответ Steeldriver для лучшего объяснения.
Существенное различие находится в обработке чисел, которые находятся в экспоненциальное представление . От info sort
, при использовании -n
(числовой) вид
Neither a leading `+' nor exponential notation is recognized. To
compare such strings numerically, use the `--general-numeric-sort'
(`-g') option.
Так, например, учитывая
$ cat file
+1.23e-1
1.23e-2
1.23e-3
1.23e4
1.23e+5
-1.23e6
затем
$ sort -n file
-1.23e6
+1.23e-1
1.23e-2
1.23e-3
1.23e4
1.23e+5
, тогда как
$ sort -g file
-1.23e6
1.23e-3
1.23e-2
+1.23e-1
1.23e4
1.23e+5
От sort
руководство:
‘-n’
‘-числовой вид’
‘-sort=numeric’Отсортируйте численно. Число начинает каждую строку и состоит из дополнительных пробелов, дополнительный ‘-’ знак, и нуль или больше цифр, возможно разделенных тысячами разделителей, дополнительно сопровождаемых символом десятичной точки и нулем или большим количеством цифр. Пустое число рассматривают как ‘0’.
LC_NUMERIC
локаль указывает символ десятичной точки и тысячи разделителя. По умолчанию пробел является пространством или вкладкой, ноLC_CTYPE
локаль может изменить это.Сравнение точно; нет никакой погрешности округления.
Ни продвижение ‘+’, ни экспоненциальное представление не распознаны. Для сравнения таких строк численно используйте
--general-numeric-sort
(-g
) опция.
И;
‘-g’
‘-общий числовой вид’
‘-sort=general-numeric’Отсортируйте численно, преобразовав префикс каждой строки к долгому числу с плавающей точкой двойной точности. Посмотрите Плавающую точку. Не сообщайте о переполнении, потере значимости или ошибках преобразования. Используйте следующую сортирующую последовательность:
- Строки, которые не запускаются с чисел (все считали равным).
- NaNs (“Не Число” значения, в арифметике плавающей точки IEEE) в последовательном, но машинно-зависимом порядке.
- Минус бесконечность.
- Конечные числа в возрастающем числовом порядке (с-0 и +0 равных).
- Плюс бесконечность.
Используйте эту опцию, только если нет никакой альтернативы; это намного медленнее, чем
--numeric-sort
(-n
) и это может потерять информацию при преобразовании в плавающую точку.
Так, это казалось бы тем использованием -g
мог привести к неправильным сравнениям из-за потери точности, но по любой причине, я не могу привести к такому результату:
$ printf "%s\n" 1 1.23 1.234 1.2345 1.23456 1.234567 1.2345678 1.23456789 1.23456788888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888 1.23456788888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888878888888888 | sort -g
1
1.23
1.234
1.2345
1.23456
1.234567
1.2345678
1.23456788888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888878888888888
1.23456788888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
1.23456789
sort -g
правильно помещает вторую широкую фракцию перед первым, но различие между этими двумя далеко за пределами точности от a double
:
$ cat test.cpp
#include<iostream>
using namespace std;
int main()
{
cout << (1.23456788888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888887888888888888888888888 < 1.23456788888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888) << endl;
cout << (1.23456788888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888887888888888888888888888 > 1.23456788888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888) << endl;
}
$ make test
g++ test.cpp -o test
$ ./test
0
0