Am besten leiten Sie zu GNU sort
weiter , mit GNU sort
ist --version-sort
Option aktiviert
das wäre also oracleasm listdisks | sort --version-sort
Von der Infoseite
--version-sort’
Sort by version name and number. It behaves like a standard sort,
except that each sequence of decimal digits is treated numerically
as an index/version number. (*Note Details about version sort::.)
Auf deine Eingabe hin gibt es mir
DATA1
DATA2
DATA3
DATA4
DATA5
DATA6
DATA7
DATA8
DATA9
DATA10
DATA11
DATA12
FRA1
FRA2
FRA3
FRA10
FRA11
OCR1
OCR2
OCR3
Wenn sort --version-sort
nicht verfügbar ist, in 2 Felder aufteilen:Feld 1 =führende Nichtziffern und Feld 2 =ganze Zahl, und die Felder mit TAB dazwischen drucken. Verwenden Sie dann sort
auf 2 TAB-getrennte Felder, dann entfernen Sie den TAB. Stellen Sie eine Verbindung über Pipes her, um E/A-Overhead zu vermeiden. Hier ist ein Beispiel mit einem minimalen Teil der Daten aus dem OP plus ein paar zusätzlichen Datensätzen:
echo 1 10 2 11 DATA DATA1 DATA10 DATA11 DATA2 FRA FRA1 FRA10 FRA11 FRA2 | \
xargs -n1 | \
perl -lne 'print join "\t", /(\D*)(\d*)/' | \
sort -k1,1 -k2,2n | \
perl -pe 's/\t//'
Drucke:
1
10
11
2
DATA
DATA1
DATA2
DATA10
DATA11
FRA
FRA1
FRA2
FRA10
FRA11
DETAILS:
Die Perl-Einzeiler verwenden diese Befehlszeilen-Flags:
-e
:weist Perl an, inline nach Code zu suchen, statt in einer Datei.
-n
:Schleife die Eingabe zeilenweise durch und weise sie $_
zu standardmäßig.
-l
:Trennzeichen der Eingabezeile entfernen ("\n"
standardmäßig auf *NIX), bevor Sie den Code inline ausführen, und hängen Sie ihn beim Drucken an.
-p
:dasselbe wie -n
, sondern auch print
die Zeile am Ende jeder Schleife (eliminiert explizit print
).
Innerhalb des ersten Einzeilers \d
ist eine beliebige Ziffer (0-9) und \D
ist eine beliebige Nicht-Ziffer. Jedes dieser Muster wird 0 Mal oder mehrmals wiederholt (unter Verwendung von *
). Die beiden Muster werden mit Klammern erfasst und als LIST
zurückgegeben aus zwei Feldern, die auf einem TAB verbunden und gedruckt werden.
Der zweite Perl-Einzeiler entfernt einfach den ersten TAB, findet nichts (leerer String) und gibt die Zeile aus.
An sort
Auf 2 Feldern werden diese Optionen verwendet:-k1,1
:nach Feld 1 ASCIIbetisch sortieren. Dann:
-k2,2n
:wenn Feld 1 gleich ist, sortiere auf Feld 2 numerisch (-n
Möglichkeit).
Beachten Sie, dass die Feldnummer zweimal wiederholt wird (z. B. 1,1
), um das Sortieren auf dem Rest der Zeile zu verhindern und die Sortierung nur auf diese Spaltennummer zu beschränken.