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.