команда сортировки: -g versus -n flag

В чем разница между использованием команды sort с -g и -n?

Я пробовал оба флажка с ls -la, и результат был идентичным.

] В man-странице говорится, что -g «сравнивается по общему численному значению» и -n «сравнивается в соответствии со строковым числовым значением»?

Я не понимаю, что они там означают.

Что означает «общее числовое значение»? Что означает «строковое числовое значение»?

1
задан 23 October 2016 в 19:02

2 ответа

Основное различие заключается в обработке чисел, которые находятся в научной нотации. Из 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
6
ответ дан 23 May 2018 в 04:54

Из руководства 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
3
ответ дан 23 May 2018 в 04:54

Другие вопросы по тегам:

Похожие вопросы: