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)
Je récupère toute les lignes de 11 caractères : cela peut être de la forme "ABCD 000001" ou "ABCDE0999999"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 numero=`echo "$fichier" | cut -c 4-21 | sed 's/^0*//'` echo $numero 41
Je remplace l'espace par le symbole "_" pour pouvoir utiliser le résultat dans une liste.
Voici la partie à optimiser:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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`
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![]()
Partager