2017-10-21 51 views
1

J'ai essayé un peu d'exemple mais je ne trouve pas le moyen de résoudre ce problème. Je pense que je devrais trouver le bon séparateur et le trier par numéro, mais cela ne fonctionne pas comme mon désir.Trier numéro dans une chaîne de texte

Ceci est mon fichier:

abc_bla_bla_bla_reg0_bla_reg_1_0 
abc_bla_bla_bla_reg0_bla_reg_5_0 
abc_bla_bla_bla_reg0_bla_reg_2_0 
abc_bla_bla_bla_reg0_bla_reg_10_0 
abc_bla_bla_bla_reg0_bla_reg_15_0 
abc_bla_bla_bla_reg2_bla_reg_15_0 
abc_bla_bla_bla_reg2_bla_reg_9_0 
abc_bla_bla_bla_reg2_bla_reg_7_0 
abc_bla_bla_bla_reg3_bla_reg_26_0 
abc_bla_bla_bla_reg3_bla_reg_3_0 
abc_bla_bla_bla_reg3_bla_reg_5_0 

Et ceci est le résultat de mon désir:

abc_bla_bla_bla_reg0_bla_reg_1_0 
abc_bla_bla_bla_reg0_bla_reg_2_0 
abc_bla_bla_bla_reg0_bla_reg_5_0 
abc_bla_bla_bla_reg0_bla_reg_10_0 
abc_bla_bla_bla_reg0_bla_reg_15_0 
abc_bla_bla_bla_reg2_bla_reg_7_0 
abc_bla_bla_bla_reg2_bla_reg_9_0 
abc_bla_bla_bla_reg2_bla_reg_15_0 
abc_bla_bla_bla_reg3_bla_reg_3_0 
abc_bla_bla_bla_reg3_bla_reg_5_0 
abc_bla_bla_bla_reg3_bla_reg_26_0 

Répondre

2
$ sort -t_ -k5,5 -k8,8n file 
abc_bla_bla_bla_reg0_bla_reg_1_0 
abc_bla_bla_bla_reg0_bla_reg_2_0 
abc_bla_bla_bla_reg0_bla_reg_5_0 
abc_bla_bla_bla_reg0_bla_reg_10_0 
abc_bla_bla_bla_reg0_bla_reg_15_0 
abc_bla_bla_bla_reg2_bla_reg_7_0 
abc_bla_bla_bla_reg2_bla_reg_9_0 
abc_bla_bla_bla_reg2_bla_reg_15_0 
abc_bla_bla_bla_reg3_bla_reg_3_0 
abc_bla_bla_bla_reg3_bla_reg_5_0 
abc_bla_bla_bla_reg3_bla_reg_26_0 

qui peuvent ou peuvent ne pas produire la sortie que vous attendez si le regN La valeur dans la 5ème colonne peut inclure des nombres à 2 chiffres.

+1

vous remercie beaucoup c'est fonctionne parfaitement !!! – Lucil120

0

En utilisant awk

$awk -F"_" 'function print_array(arr,max){ for(i=1; i<=max; i++) if(a[i]){print a[i], a[i]="";} } key==$5{a[$8]=$0; key=$5; max=$8>max?$8:max} key!=$5{print_array(a,max); key=$5; a[$8]=$0; max=$8} END{print_array(a,max)}' file 

Sortie:

abc_bla_bla_bla_reg0_bla_reg_1_0 
abc_bla_bla_bla_reg0_bla_reg_2_0 
abc_bla_bla_bla_reg0_bla_reg_5_0 
abc_bla_bla_bla_reg0_bla_reg_10_0 
abc_bla_bla_bla_reg0_bla_reg_15_0 
abc_bla_bla_bla_reg2_bla_reg_7_0 
abc_bla_bla_bla_reg2_bla_reg_9_0 
abc_bla_bla_bla_reg2_bla_reg_15_0 
abc_bla_bla_bla_reg3_bla_reg_3_0 
abc_bla_bla_bla_reg3_bla_reg_5_0 
abc_bla_bla_bla_reg3_bla_reg_26_0 

Explication:

awk -F"_" ' 
    function print_array(arr,max) #Simply prints the hashed array from i=1 to max value array is holding 
    { 
     for(i=1; i<=max; i++) 
     if(a[i]) 
      {print a[i], a[i]="";} 
    } 

    key==$5{a[$8]=$0; max=$8>max?$8:max} #Key here denotes the 5th field for eg. reg0 in line one. Initially key is null and it will satisfy the condition mentioned below i.e key!=$5. If the 5th field matches with the key set in previous line then push the record into array where the index in array will be the value at field 8 based on which you want to sort your results. 

    key!=$5{print_array(a,max); key=$5; a[$8]=$0; max=$8} #If key doesn't matches the 5th line it signifies we have a new record set and before proceeding further print the array we stored for previous record set based on 5th field. 

    END{print_array(a,max) #To print the last record set 

    }' file 

key==$5{a[$8]=$0; max=$8>max?$8:max}: Key désigne ici le 5e champ pour par exemple. reg0 dans la première ligne. Initialement key est null et il satisfera la condition mentionnée ci-dessous i.e key!=$5. Si le 5ème champ $5 correspond à la clé définie dans la ligne précédente, alors poussez l'enregistrement dans le tableau où l'index dans le tableau sera la valeur au champ 8 sur la base duquel vous voulez trier vos résultats. Cela fonctionnera indépendamment du nombre de chiffres dans $8. Si key ne correspond pas à la 5ème ligne, cela signifie que nous avons un nouveau jeu d'enregistrements et avant d'imprimer davantage le tableau que nous avons stocké pour le jeu d'enregistrements précédent basé sur le 5ème champ.

END{print_array(a,max) Juste pour imprimer le dernier record établi

0
sort -V file 

-V, --version tri tri naturel des nombres (version) dans le texte

+0

je ne trouve pas d'information sur le sort -V dans le manuel de sort :( – Lucil120

+0

et c'est la raison pour laquelle j'ai cité cette information. – thanasisp