sort
bietet zwei Arten der numerischen Sortierung. Dies ist von der Manpage:
-g, --general-numeric-sort
compare according to general numerical value
-n, --numeric-sort
compare according to string numerical value
Was ist der Unterschied?
sort
nicht dieman
Seite, sondern dieinfo
Seite (info sort
) ist.Antworten:
Die allgemeine numerische Sortierung vergleicht die Zahlen als Gleitkommazahlen. Dies ermöglicht eine wissenschaftliche Notation, z. B. 1.234E10, ist jedoch langsamer und unterliegt einem Rundungsfehler (1.2345678 könnte nach 1.2345679 kommen). Die numerische Sortierung ist nur eine reguläre alphabetische Sortierung, bei der 10 nach 9 steht.
Siehe http://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html
quelle
-k3.2n
oder-k3.2g
wirdR10
vorher sortiertR2
. Die Sortierung ist lexikografisch und nicht numerisch. Ich erwarte, dass das Feld ab dem zweiten Zeichen als Zahl behandelt wird.sort
's Schlüsselspezifikationen. sind wirklich byzantinisch - das kurze daran ist: Die Leerzeichen vor dem Feld werden als Teil des Feldes betrachtet , also char. Index 1 zeigt auf das (erste) Leerzeichen vor dem Feld, nicht auf das tatsächliche erste Zeichen des Feldes. Suffix das Zeichen. Index mitb
, um dieses Problem zu beheben, dh:-k 3.2bn,3
(Beachten Sie, dass die globale-b
Option in diesem Fall nicht funktioniert). Beachten Sie auch das hinzugefügte,3
, das sicherstellt, dass nur das 3. Feld verwendet wird - ohne diesen 2. Feldindex wird der Rest der gesamten Zeile verwendet.Sie sollten mit Ihrem Gebietsschema vorsichtig sein. Beispielsweise möchten Sie möglicherweise eine gleitende Zahl (wie 2.2) sortieren, während Ihr Gebietsschema möglicherweise die Verwendung eines Kommas (wie 2,2) erwartet.
Wie in diesem Forum berichtet , können Sie mit den Flags -n oder -g falsche Ergebnisse erzielen.
In meinem Fall benutze ich:
um die 6. Spalte zu sortieren, die enthält:
um zu erhalten
quelle
-n
Komma nicht als Tausendertrennzeichen erkennen - "1.000" wird genauso behandelt wie "1".sort
Verwendet die Logik mit dem längsten Präfix : Der längste Teil der Zeile / des Schlüssels, den er als Zahl erkennt, wird verwendet. In einem Gebietsschema, das.
als Radix-Zeichen verwendet wird, hört das Lesen bei auf,
.LC_ALL=C
ist in der Tat die robusteste Wahl; Wenn jedochLC_ALL
nicht gesetztLANG=C
wird, funktioniert dies auch.LANG=C sort -k 6,6n file
sowohl einfacher als auch lokalisiert den Effekt des Festlegens von UmgebungsvariablenLANG
auf den spezifischen Befehl.Zusätzlich zu der akzeptierten Antwort, die
-g
eine wissenschaftliche Notation zulässt , möchte ich den Teil zeigen, der höchstwahrscheinlich unerwünschtes Verhalten verursacht.Mit
-g
:Schauen Sie sich die
zoo
drei wichtigen Dinge hier an:Die Linie beginnt mit
NAN
(zBNana
undnani lol
) oder-INF
(einzelner Bindestrich, nicht--INF
) bis zum Ende, jedoch vor den Ziffern. WährendINF
Umzug in den letzten nach Ziffern , weil es bedeutet, unendlich .Die
NAN
,INF
und-INF
sind Groß- und Kleinschreibung .Die Zeilen ignorieren Leerzeichen immer von beiden Seiten
NAN
,INF
,-INF
(unabhängig davonLC_CTYPE
). Andere alphabetische Zeichen können Leerzeichen von beiden Seiten ignorieren, abhängig vom GebietsschemaLC_COLLATE
LC_COLLATE=fr_FR.UTF-8
ignorieren (z. B. ignorieren, aberLC_COLLATE=us_EN.UTF-8
nicht ignorieren).Wenn Sie also beliebige alphanumerische Zeichen sortieren, möchten Sie dies wahrscheinlich nicht
-g
. Wenn Sie wirklich einen Vergleich der wissenschaftlichen Notation mit benötigen-g
, möchten Sie wahrscheinlich alphabetische und numerische Daten extrahieren und den Vergleich separat durchführen .Wenn Sie nur eine normale Nummer benötigen (z
1, -1
) und dies für0x/E/+ sorting
nicht wichtig halten, verwenden Sie einfach-n
genug:Entweder
-g
oder-n
, sich bewusst sein locale Wirkung . Sie können angeben möchtenLC_NUMERIC
alsus_EN.UTF-8
zu vermeiden fr_FR.UTF-8 Art-
mit schwimmender Nummer fehlgeschlagen :Mit
LC_NUMERIC=en_US.UTF-8
:Oder
LC_NUMERIC=us_EN.UTF-8
zu gruppieren+|-|space
mitalpha
:Sie möchten wahrscheinlich
locale
bei der Verwendung angeben ,sort
ob ein tragbares Skript geschrieben werden soll.quelle