Votre meilleur pari est de passer à GNU sort , avec GNU sort est --version-sort option activée
donc ce serait oracleasm listdisks | sort --version-sort
Depuis la page d'informations
--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::.)
Sur votre entrée, il me donne
DATA1
DATA2
DATA3
DATA4
DATA5
DATA6
DATA7
DATA8
DATA9
DATA10
DATA11
DATA12
FRA1
FRA2
FRA3
FRA10
FRA11
OCR1
OCR2
OCR3
Si sort --version-sort n'est pas disponible, divisez-le en 2 champs :champ 1 =non-chiffres de tête et champ 2 =nombre entier, et imprimez les champs avec TAB entre eux. Utilisez ensuite sort sur 2 champs délimités par des tabulations, puis supprimez la tabulation. Connectez-vous par des tuyaux pour éviter les frais généraux d'E / S. Voici un exemple avec une tranche minimale des données de l'OP, plus quelques enregistrements supplémentaires :
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//'
Impressions :
1
10
11
2
DATA
DATA1
DATA2
DATA10
DATA11
FRA
FRA1
FRA2
FRA10
FRA11
DÉTAILS :
Les one-liners perl utilisent ces drapeaux de ligne de commande :
-e :indique à Perl de rechercher le code en ligne, plutôt que dans un fichier.
-n :boucle sur l'entrée une ligne à la fois, en l'affectant à $_ par défaut.
-l :supprime le séparateur de ligne d'entrée ("\n" sur *NIX par défaut) avant d'exécuter le code en ligne, et ajoutez-le lors de l'impression.
-p :identique à -n , mais aussi print la ligne à la fin de chaque boucle (élimine le print explicite ).
Dans la première ligne, \d est n'importe quel chiffre (0-9), et \D est tout non-chiffre. Chacun de ces motifs est répété 0 fois ou plus (en utilisant * ). Les deux modèles sont capturés à l'aide de parenthèses et renvoyés sous la forme d'un LIST de deux champs, qui sont joints sur une TAB et imprimés.
Le deuxième one-liner Perl supprime simplement le premier TAB est trouvé sans rien (chaîne vide) et imprime la ligne.
Vers sort sur 2 champs, ces options sont utilisées :-k1,1 :tri sur le champ 1 en ASCIIbétique. Alors:
-k2,2n :si le champ 1 est le même, trier sur le champ 2 numériquement (-n option).
Notez que le numéro de champ est répété deux fois (par exemple, 1,1 ), pour empêcher le tri sur le reste de la ligne et limiter le tri à ce seul numéro de colonne.