Warum wird bei der Sortierung ein Datensatz ohne Nummer nach „0“ angezeigt?


8

Ich möchte Dateien nach der Nummer im Dateinamen sortieren. Hier sind die Dateien:

$ ls *.f
0.f  13.f  1.f  22.f  4.f  abc.f

Das Sortierergebnis:

$ ls *.f | sort -t. -k1n
0.f
abc.f # note this file!
1.f
4.f
13.f
22.f

Was ich erwartet hatte war:

$ ls *.f | sort -t. -k1n
abc.f
0.f
1.f
4.f
13.f
22.f

Warum wurde abc.fkurz danach 0.fund vorher gezeigt 1.f? Liegt es daran, dass von 0nicht als Zahl behandelt wird sort? Ich habe im Internet gesucht und keine Referenz gefunden.


Immer noch das gleiche nach dem Hinzufügen LC_ALL=C.
nn0p

Antworten:


12

Der Grund dafür ist, dass bei Verwendung der numerischen Sortierung Zeichenfolgen ohne Zahlen als Null behandelt werden. Die GNU-Sortierung stimmt das Verhalten, gibt jedoch keinen Kommentar dazu ab, warum. Die Manpage zu illumos für SunOS sort bietet eine Erklärung:

-n
Beschränkt den Sortierschlüssel auf eine anfängliche numerische Zeichenfolge, die aus optionalen Leerzeichen, optionalem Minuszeichen und null oder mehr Ziffern mit einem optionalen Radixzeichen und Tausenden von Trennzeichen (wie im aktuellen Gebietsschema definiert) besteht und nach arithmetischen Werten sortiert ist . Eine leere Ziffernfolge wird als Null behandelt. Führende Nullen und Vorzeichen auf Nullen haben keinen Einfluss auf die Reihenfolge.

Dieses Verhalten wird auch in SUSv4 und POSIX.1-2008 ( http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sort.html ) unter Verwendung derselben Sprache wie in der Manpage illumos angegeben.

Die GNU-Sortierung hat auch die -g"allgemeine numerische Sortierung", die nach Gleitkommazahlen anstelle von Ganzzahlen sortiert wird, bei denen leere Ziffernfolgen vor Null sortiert werden. Ich bin mir nicht sicher, ob dies eine Nebenwirkung oder eine Absicht ist. Allerdings -gkommt mit einer Warnung , da es deutlich langsamer als ist -n. Wenn Sie einen großen Datensatz sortieren oder etwas tun, auf das Benutzer warten, sollten Sie dies vermeiden -g.


Der Vollständigkeit halber sollten Sie auch erwähnen, wie sortmit zwei Zeilen mit demselben Schlüssel umgegangen wird.
Kasperd

1

Sie können -g verwenden

-g, --general-numeric-sort vergleiche nach allgemeinem numerischen Wert

root@virt01-ubuntu:~# ls  | sort -t. -k1g
a.txt
0.txt
1.txt
2.txt
3.txt
root@virt01-ubuntu:~#
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.