La cosa migliore è fare il piping a GNU sort
, con GNU sort
è --version-sort
opzione abilitata
quindi sarebbe oracleasm listdisks | sort --version-sort
Dalla pagina delle informazioni
--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::.)
Al tuo input mi dà
DATA1
DATA2
DATA3
DATA4
DATA5
DATA6
DATA7
DATA8
DATA9
DATA10
DATA11
DATA12
FRA1
FRA2
FRA3
FRA10
FRA11
OCR1
OCR2
OCR3
Se sort --version-sort
non è disponibile, diviso in 2 campi:campo 1 =non cifre iniziali e campo 2 =numero intero e stampa i campi separati da TAB. Quindi usa sort
su 2 campi delimitati da TAB, quindi rimuovere il TAB. Collegare tramite tubi per evitare il sovraccarico I/O. Ecco un esempio con una porzione minima dei dati dall'OP, più alcuni record aggiuntivi:
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//'
Stampe:
1
10
11
2
DATA
DATA1
DATA2
DATA10
DATA11
FRA
FRA1
FRA2
FRA10
FRA11
DETTAGLI:
Gli one-liner perl usano questi flag della riga di comando:
-e
:dice a Perl di cercare il codice in linea, invece che in un file.
-n
:passa sopra l'input una riga alla volta, assegnandolo a $_
per impostazione predefinita.
-l
:rimuove il separatore di riga di input ("\n"
su *NIX per impostazione predefinita) prima di eseguire il codice in linea e aggiungerlo durante la stampa.
-p
:uguale a -n
, ma anche print
la riga alla fine di ogni ciclo (elimina print
esplicito ).
All'interno della prima riga, \d
è qualsiasi cifra (0-9) e \D
è qualsiasi non cifra. Ciascuno di questi schemi viene ripetuto 0 o più volte (usando *
). I due modelli vengono catturati utilizzando le parentesi e restituiti come LIST
di due campi, che vengono uniti su un TAB e stampati.
Il secondo one-liner Perl rimuove semplicemente il primo TAB trova senza niente (stringa vuota) e stampa la riga.
A sort
su 2 campi, vengono utilizzate queste opzioni:-k1,1
:ordina sul campo 1 in modo ASCIIbetico. Quindi:
-k2,2n
:se il campo 1 è lo stesso, ordina il campo 2 numericamente (-n
opzione).
Tieni presente che il numero del campo viene ripetuto due volte (ad esempio, 1,1
), per impedire l'ordinamento sul resto della riga e limitare l'ordinamento solo a questo numero di colonna.