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.f
kurz danach 0.f
und vorher gezeigt 1.f
? Liegt es daran, dass von 0
nicht als Zahl behandelt wird sort
? Ich habe im Internet gesucht und keine Referenz gefunden.
LC_ALL=C
.Antworten:
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:
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-g
kommt 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
.quelle
sort
mit zwei Zeilen mit demselben Schlüssel umgegangen wird.Sie können -g verwenden
quelle