Piste d'amélioration de la vitesse d'un script
Bonjour,
C'est un peu la suite du poste ici
Je récupère un numéro à partir du nom du fichier (du caractère 4 au 21) qui peut avoir des zéros au début (et c'est quasi toujours le cas)
J'utilise donc la commande suivante pour le récupérer (le echo est là car je récupère le nom du fichier via une requête SQL, plus exactement une liste de fichier)
Code:
1 2 3 4
|
numero=`echo "$fichier" | cut -c 4-21 | sed 's/^0*//'`
echo $numero
41 |
Je récupère toute les lignes de 11 caractères : cela peut être de la forme "ABCD 000001" ou "ABCDE0999999"
Je remplace l'espace par le symbole "_" pour pouvoir utiliser le résultat dans une liste.
Code:
1 2 3 4
|
liste_ligne_nb_cr_type=`awk 'length == 11 { sub(/ /,"_",$0); print $0 }' output/$fichier`
echo $liste_ligne_nb_cr_type
AB13_000023 AB123000023 |
Voici la partie à optimiser:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
for fichier in $liste_fichier
do
#On récupére le numéro de l'abonné : ABC000000000000000041xxxxxxxxxxxxxxxxxxxxxxxxxxxx => 41
numero_abonne=`echo "$fichier" | cut -c 4-21 | sed 's/^0*//'`
#Ne garder que les en-tête évènement = Ligne de 11 caractères commençant par une lettre (on y remplace l'espace par "_" pour l'avoir en un seul morceau)
liste_ligne_nb_cr_type=`awk 'length == 11 { sub(/ /,"_",$0); print $0 }' output/$fichier`
for ligne_nb_cr_type in $liste_ligne_nb_cr_type
do
#Nombre de CR associé à ce type de cr (AB13_000023 => 23)
nb_cr=`echo $ligne_nb_cr_type | sed 's/.....0*\(.*\)/\1/'`
#Abonné associé à son type de CR sous la forme : AB13__41 / AB123_41 ( "type cr" _ "numéro abonné" )
type_subscriber=`echo $ligne_nb_cr_type | sed "s/\(.....\).*/\1_$numero_abonne/"`
#On l'ajoute à la liste des abonnés associés à leur type de CR
liste_type_subscriber+=" $type_subscriber"
#Cumuler le nombre de CR pour chaque type
eval $type_subscriber=$(($type_subscriber + $nb_cr))
done
done
#On trie les abonnés associés à leur type de CR (en enlevant les doublons)
liste_type_subscriber_unique=`for type_subscriber in $liste_type_subscriber; do echo $type_subscriber; done | sort -u` |
J'avais pensé à tester si l'abonné existait déjà dans la liste "liste_type_subscriber" avant de l'ajouter. Mais il semble plus efficace de tous les ajouter puis de faire un sort à la fin.
Je pourrais essayer de me servir du awk pour faire les calculs, mais il ne semble pas possible d'utiliser une variable externe afin de la modifier ...
Je stocke tout en mémoire plutôt que dans des fichiers car cela devrait être plus rapide.
Auriez-vous des idées d'optimisation ?
Merci
ps: le code était moins rapide avant :aie: