В чем разница между использованием команды sort с -g и -n?
Я пробовал оба флажка с ls -la, и результат был идентичным.
] В man-странице говорится, что -g «сравнивается по общему численному значению» и -n «сравнивается в соответствии со строковым числовым значением»?
Я не понимаю, что они там означают.
Что означает «общее числовое значение»? Что означает «строковое числовое значение»?
Основное различие заключается в обработке чисел, которые находятся в научной нотации. Из 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' '--numeric-sort' '--sort = numeric' Сортировать численно. Число начинается с каждой строки и состоит из необязательных пробелов, необязательного знака «-» и нулей или более цифр, возможно разделенных разделителями тысяч, необязательно сопровождаемых символом десятичной точки и нулями или более цифрами. Пустым номером считается «0». Локаль LC_NUMERIC задает символ десятичной точки и разделитель тысяч. По умолчанию пробел - это пробел или вкладка, но локаль LC_CTYPE может изменить это. Сравнение точное; ошибка округления отсутствует. Ни ведущая «+», ни экспоненциальная нотация не распознаются. Чтобы сравнить такие строки в численном порядке, используйте параметр --general-numeric-sort (-g).И
'- n' '--numeric-sort' '--sort = numeric'
Сортировать численно, преобразование префикса каждой строки к длинному числу с плавающей запятой двойной точности. См. Плавающая точка. Не сообщайте об ошибках переполнения, недоиспользования или преобразования. Используйте следующую последовательность сортировки: Линии, которые не начинаются с цифр (все считаются равными). NaNs (значения «Не число» в арифметике с плавающей точкой IEEE) в последовательном, но зависящем от машины порядке. Минус-бесконечность. Конечные числа в возрастающем числовом порядке (с -0 и +0 равными). Плюс бесконечность.Сортировать численно. Число начинается с каждой строки и состоит из необязательных пробелов, необязательного знака «-» и нулей или более цифр, возможно разделенных разделителями тысяч, необязательно сопровождаемых символом десятичной точки и нулями или более цифрами. Пустым номером считается «0». Локаль LC_NUMERIC задает символ десятичной точки и разделитель тысяч. По умолчанию пробел - это пробел или табуляция, но локаль LC_CTYPE может изменить это.
'- g' '--general-numeric-sort' '--sort = general-numeric '
$ 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
Используйте этот параметр только в том случае, если альтернативы нет; он намного медленнее, чем --numeric-sort (-n), и он может потерять информацию при преобразовании в плавающую точку.
$ 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