GNU/Linux >> Tutoriels Linux >  >> Linux

Comment trier cette sortie 1,10,11..2

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.


Linux
  1. Comment enregistrer la sortie de la commande dans un fichier sous Linux

  2. Comment rediriger la sortie d'un programme vers un fichier Zip ? ?

  3. Comment se rappeler comment utiliser la redirection ?

  4. Comment créer une sortie virtuelle dans Pulseaudio ?

  5. Trier la sortie par colonne ?

Comment supprimer ce répertoire indélébile ?

Comment trier un fichier sur place

Comment puis-je filtrer les résultats uniques de la sortie grep ?

tcpdump :comment obtenir une sortie grepable ?

Comment grep ps sortie avec des en-têtes

Comment arrêter la sortie du ping ?