Tu mejor apuesta es canalizar a GNU sort
, con GNU sort
--version-sort
de opción habilitada
por lo que sería oracleasm listdisks | sort --version-sort
Desde la página de información
--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::.)
En tu entrada me da
DATA1
DATA2
DATA3
DATA4
DATA5
DATA6
DATA7
DATA8
DATA9
DATA10
DATA11
DATA12
FRA1
FRA2
FRA3
FRA10
FRA11
OCR1
OCR2
OCR3
Si sort --version-sort
no está disponible, divídalo en 2 campos:campo 1 =sin dígitos iniciales y campo 2 =número entero, e imprima los campos con TAB entre ellos. Luego usa sort
en 2 campos delimitados por TAB, luego elimine la TAB. Conéctese mediante tuberías para evitar la sobrecarga de E/S. Aquí hay un ejemplo con una porción mínima de los datos del OP, más algunos registros adicionales:
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//'
Impresiones:
1
10
11
2
DATA
DATA1
DATA2
DATA10
DATA11
FRA
FRA1
FRA2
FRA10
FRA11
DETALLES:
Los one-liners de perl usan estos indicadores de línea de comandos:
-e
:le dice a Perl que busque el código en línea, en lugar de en un archivo.
-n
:recorrer la entrada una línea a la vez, asignándola a $_
por defecto.
-l
:quita el separador de línea de entrada ("\n"
en *NIX de forma predeterminada) antes de ejecutar el código en línea y añádalo al imprimir.
-p
:igual que -n
, pero también print
la línea al final de cada ciclo (elimina print
explícito ).
Dentro de la primera línea, \d
es cualquier dígito (0-9), y \D
es cualquier no dígito. Cada uno de estos patrones se repite 0 o más veces (usando *
). Los dos patrones se capturan usando paréntesis y se devuelven como un LIST
de dos campos, que se unen en una TAB y se imprimen.
La segunda línea de Perl simplemente elimina la primera TAB, no encuentra nada (cadena vacía) e imprime la línea.
A sort
en 2 campos se utilizan estas opciones:-k1,1
:ordenar en el campo 1 ASCIIbéticamente. Después:
-k2,2n
:si el campo 1 es el mismo, ordenar el campo 2 numéricamente (-n
opción).
Tenga en cuenta que el número de campo se repite dos veces (por ejemplo, 1,1
), para evitar la clasificación en el resto de la línea y limitar la clasificación solo a este número de columna.