it-swarm.com.de

Wie sortiere ich Strings, die ein gemeinsames Präfix und Suffix enthalten, numerisch aus Bash?

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?

27
AWE

Verwenden Sie ls -lv

Aus der Manpage:

-v     natural sort of (version) numbers within text
37
Steve

Versuche Folgendes:

sort -t '_' -k 2n
  • -t '_' (setzt das Trennzeichen auf das Unterstreichungszeichen)
  • -k 2n (Sortiert nach der zweiten Spalte in numerischer Reihenfolge)

DEMO.

30
João Silva

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.

2
tripleee

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
0
Rhubbarb