Hier ist eine Liste von Dateien:
some.string_100_with_numbers.in-it.txt
some.string_101_with_numbers.in-it.txt
some.string_102_with_numbers.in-it.txt
some.string_23_with_numbers.in-it.txt
some.string_24_with_numbers.in-it.txt
some.string_25_with_numbers.in-it.txt
Nun möchte ich es numerisch sortieren. Beginnt mit * 23 * und endet mit * 102 *.
Ich habe -n
und -g
ausprobiert. -t
hilft nicht bei diesen unordentlichen Zeichenfolgen.
Kann ich führende Zeichenfolgen mit einer Option ignorieren oder muss ich klug und skript sein?
Verwenden Sie ls -lv
Aus der Manpage:
-v natural sort of (version) numbers within text
Versuche Folgendes:
sort -t '_' -k 2n
-t '_'
(setzt das Trennzeichen auf das Unterstreichungszeichen)-k 2n
(Sortiert nach der zweiten Spalte in numerischer Reihenfolge)DEMO.
Versuchen Sie im Allgemeinen die Schwartzian-Transformation .
Brechen Sie die Nummer kurz in ein eigenes Feld ein, sortieren Sie dieses und löschen Sie das hinzugefügte Feld.
# In many shells, use ctrl-v tab to insert a literal tab after the first \2
sed 's/^\([^0-9]*\)\([0-9][0-9]*\)/\2 \1\2/' file |
sort -n |
cut -f2-
Dies funktioniert gut, wenn die Eingabe kein offensichtliches Trennzeichen enthält, wie bei der folgenden Eingabe.
abc1
abc10
abc2
wo soll die Sortierung die letzte Zeile direkt nach der ersten verschieben.
Falls verfügbar, verwenden Sie einfach sort -V
. Dies ist eine Sortierung nach Versionsnummern, funktioniert jedoch gut als "natürliche Sortieroption".
$ ff=$( echo some.string_{100,101,102,23,24,25}_with_numbers.in-it.txt )
Ohne Sorte:
$ for f in $ff ; do echo $f ; done
some.string_100_with_numbers.in-it.txt
some.string_101_with_numbers.in-it.txt
some.string_102_with_numbers.in-it.txt
some.string_23_with_numbers.in-it.txt
some.string_24_with_numbers.in-it.txt
some.string_25_with_numbers.in-it.txt
Mit sort -V:
$ for f in $ff ; do echo $f ; done | sort -V
some.string_23_with_numbers.in-it.txt
some.string_24_with_numbers.in-it.txt
some.string_25_with_numbers.in-it.txt
some.string_100_with_numbers.in-it.txt
some.string_101_with_numbers.in-it.txt
some.string_102_with_numbers.in-it.txt