команда вида:-g по сравнению с флагом-n

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

Я попробовал оба флага ls -la и вывод был идентичен.

В странице справочника говорится это -g "выдерживает сравнение согласно общему численному значению" и -n "выдерживает сравнение согласно строковому численному значению"?

Я не получаю то, что они имеют в виду там.

Что делает "общее численное значение", среднее? Что действительно "представляет в виде строки численное значение", среднее?

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

3 ответа

От 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 для лучшего объяснения.

3
ответ дан 1 December 2019 в 13:03

Существенное различие находится в обработке чисел, которые находятся в экспоненциальное представление . От 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
ответ дан 1 December 2019 в 13:03

От 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
3
ответ дан 1 December 2019 в 13:03

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

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