it-swarm.com.de

Befehl sort: -g versus -n flag

Was ist der Unterschied zwischen der Verwendung des Befehls sort mit -g Und -n?

Ich habe beide Flags mit ls -la Ausprobiert und die Ausgabe war identisch.

Die Manpage sagt, dass -g "Nach dem allgemeinen Zahlenwert vergleicht" und -n "Nach dem Zahlenwert der Zeichenkette vergleicht"?

Ich verstehe nicht, was sie dort bedeuten.

Was bedeutet "allgemeiner Zahlenwert"? Was bedeutet "numerischer Stringwert"?

2
bew5

Sortieren Sie auf der Infoseite sort-g wird durch diese erklärt

‘-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 ist die natürliche Sorte, die wir normalerweise erwarten

‘-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.

Überprüfen Sie Steeldrivers Antwort für eine bessere Erklärung.

3
Anwar

Der Hauptunterschied besteht in der Behandlung von Zahlen in wissenschaftliche Schreibweise . Von info sort, wenn -n (numerische) Sortierung

 Neither a leading `+' nor exponential notation is recognized.  To
 compare such strings numerically, use the `--general-numeric-sort'
 (`-g') option.

So zum Beispiel gegeben

$ cat file
+1.23e-1
1.23e-2
1.23e-3
1.23e4
1.23e+5
-1.23e6

dann

$ sort -n file
-1.23e6
+1.23e-1
1.23e-2
1.23e-3
1.23e4
1.23e+5

wohingegen

$ sort -g file
-1.23e6
1.23e-3
1.23e-2
+1.23e-1
1.23e4
1.23e+5
6
steeldriver

Von das sort Handbuch :

‘- n’
‘- numerische Sortierung’
‘- sort = numeric’

Numerisch sortieren. Die Nummer beginnt in jeder Zeile und besteht aus optionalen Leerzeichen, einem optionalen "-" - Zeichen und null oder mehr Ziffern, die möglicherweise durch Tausendertrennzeichen getrennt sind, optional gefolgt von einem Dezimalzeichen und null oder mehr Ziffern. Eine leere Nummer wird als "0" behandelt. Das LC_NUMERIC locale gibt das Dezimalzeichen und das Tausendertrennzeichen an. Standardmäßig ist ein Leerzeichen ein Leerzeichen oder ein Tabulator, aber das LC_CTYPE locale kann dies ändern.

Der Vergleich ist genau; Es liegt kein Rundungsfehler vor.

Es wird weder ein führendes "+" noch eine exponentielle Notation erkannt. Um solche Zeichenfolgen numerisch zu vergleichen, verwenden Sie --general-numeric-sort (-g) Möglichkeit.

Und;

‘- g’
‘- allgemeine numerische Sortierung’
‘- sort = general-numeric’

Numerisch sortieren, wobei ein Präfix jeder Zeile in eine lange Gleitkommazahl mit doppelter Genauigkeit konvertiert wird. Siehe Gleitkomma . Melden Sie keine Überlauf-, Unterlauf- oder Konvertierungsfehler. Verwenden Sie die folgende Sortierfolge:

  • Zeilen, die nicht mit Zahlen beginnen (alle werden als gleich angesehen).
  • NaNs („Not a Number“ -Werte in IEEE-Gleitkomma-Arithmetik) in einer konsistenten, aber maschinenabhängigen Reihenfolge.
  • Minus unendlich.
  • Endliche Zahlen in aufsteigender numerischer Reihenfolge (mit -0 und +0 gleich).
  • Plus unendlich.

Verwenden Sie diese Option nur, wenn es keine Alternative gibt. es ist viel langsamer als --numeric-sort (-n) und es können Informationen verloren gehen, wenn in Gleitkomma konvertiert wird.

Also würde es scheinen dass mit -g könnte aufgrund von Genauigkeitsverlusten zu falschen Vergleichen führen, aber aus irgendeinem Grund kann ich kein solches Ergebnis erzielen:

$ 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 platziert den zweiten langen Bruch korrekt vor dem ersten, aber der Unterschied zwischen den beiden ist weit jenseits der Genauigkeit eines 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
muru