Comment utiliser, dans un script sh, des variables créées dans un script gawk
zigroful
Messages postés
20
Date d'inscription
Statut
Membre
Dernière intervention
-
zipe31 Messages postés 36402 Date d'inscription Statut Contributeur Dernière intervention -
zipe31 Messages postés 36402 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Ma configuration est Ubuntu 18.04 LTS
J'ai créé un fichier csv contenant 3 colonnes : la première est le numéro de la ligne, la seconde est alphanumerique (pour simplifier a1, a2, a3, etc...) et la 3ème exclusivement numérique, du type:
Dans la deuxième colonne certains éléments se retrouvent plusieurs fois sans que la valeur à droite ne soit nécessairement la même.
Je souhaiterai, en utilisant sed et awk, calculer les sous-totaux des lignes ayant même identifiant donné par la 2ème colonne (je matche sur la 2ème colonne, les lignes en utilisant sed et des patterns entrés dans un tableau var[i] et je fais la somme des lignes matchées), pour obtenir :
Jusque là tout se passe bien avec Sed et Awk que j'emploie de cette manière:
Mais ça se gatte lorsque je veux faire la somme des totaux partiels, en faisant juste après:
Il m'affiche invariablement Total des sommes partielles = 0
Quelqu'un saurait-il me dire pourquoi ?
Ma configuration est Ubuntu 18.04 LTS
J'ai créé un fichier csv contenant 3 colonnes : la première est le numéro de la ligne, la seconde est alphanumerique (pour simplifier a1, a2, a3, etc...) et la 3ème exclusivement numérique, du type:
1; a1 ; 3.2
2; a2 ; 5.36
3; a1 ; 18.4
4; a4 ; 2.6
5; a2 ; 4.32
6; a7 ; 12.7
7; a19 ; 45
8; a3 ; 42
etc... etc...
Dans la deuxième colonne certains éléments se retrouvent plusieurs fois sans que la valeur à droite ne soit nécessairement la même.
Je souhaiterai, en utilisant sed et awk, calculer les sous-totaux des lignes ayant même identifiant donné par la 2ème colonne (je matche sur la 2ème colonne, les lignes en utilisant sed et des patterns entrés dans un tableau var[i] et je fais la somme des lignes matchées), pour obtenir :
TotalPartiel_a1 = 21.6
TotalPartiel_a2= 9.68
TotalPartiel_a3=42
etc ..
Jusque là tout se passe bien avec Sed et Awk que j'emploie de cette manière:
for i in $indice #dimension du tableau var[] contenant les patterns do echo -e '\n' echo -e ==============$i========${var[i]}=============== # Matche les lignes correspondantes aux patterns var[i] et affecte le numero de la ligne en début de ligne puis procède aux sommes partielles (3ème colonne) relatives à chaque groupe matché sed -n '/'"${var[i]}"'/{=;p}' FichierEntree.csv | sed -e 'N;s/\n/; /'| gawk 'BEGIN {FS=";";OFMT="%.9g"}{TotalPartiel +=$3}{print $0} END{printf "\n\n TOTAL PARTIEL '$i'= %.2f",TotalPartiel}' done
Mais ça se gatte lorsque je veux faire la somme des totaux partiels, en faisant juste après:
gawk 'END{TotalSommesPartielles +=TotalPartiel; printf "\n TOTAL DES SOMMES PARTIELLES =%.2f \n\n", TotalSommesPartielles;}'
Il m'affiche invariablement Total des sommes partielles = 0
Quelqu'un saurait-il me dire pourquoi ?
A voir également:
- Comment utiliser, dans un script sh, des variables créées dans un script gawk
- Script vidéo youtube - Guide
- Comment utiliser un chromecast - Guide
- Mas script - Accueil - Windows
- Script cmd - Guide
- Utiliser iphone comme webcam - Guide
3 réponses
Salut,
awk peut faire cela tout seul comme un grand ;-))
awk peut faire cela tout seul comme un grand ;-))
$ cat f1
1; a1 ; 3.2
2; a2 ; 5.36
3; a1 ; 18.4
4; a4 ; 2.6
5; a2 ; 4.32
6; a7 ; 12.7
7; a19 ; 45
8; a3 ; 42
$ awk -F";" '{array[$2]+=$3}END{for (name in array) {print "TotalPartiel_"name," = ", array[name]}}' f1
TotalPartiel_ a1 = 21.6
TotalPartiel_ a19 = 45
TotalPartiel_ a2 = 9.68
TotalPartiel_ a3 = 42
TotalPartiel_ a4 = 2.6
TotalPartiel_ a7 = 12.7
Merci zip31 mais comment faire le total des totaux partiels ?
Encore une fois merci beaucoup pour votre réactivité
Cependant, j'ai voulu, dans ma question, simplifier pour ne pas alourdir le texte.
En fait, les a1, a2 a3, etc... qui sont des expressions alphanumériques représentant des patterns complexes de plusieurs lignes du genre b1\|b2\|b3\|...\|bn chacun des b étant lui-même composé de plusieurs mots. Les mettre en indice de TotalPartiel_ comme vous le proposez, rendrait les sorties illisibles.
Pour pallier à ce défaut, et pour me permettre de faire évoluer mes patterns, j'ai imaginé les regrouper dans un tableau que j'ai appelé var[i], ce qui me permet au fur et à mesure que j'avance dans la lecture de mon fichier d'entrée, d'enrichir les patterns de manière à regrouper, de plus en plus, les lignes correspondantes.
Auriez-vous une solution pour ce genre de problème ?
Me suis-je fait bien comprendre ?
Cependant, j'ai voulu, dans ma question, simplifier pour ne pas alourdir le texte.
En fait, les a1, a2 a3, etc... qui sont des expressions alphanumériques représentant des patterns complexes de plusieurs lignes du genre b1\|b2\|b3\|...\|bn chacun des b étant lui-même composé de plusieurs mots. Les mettre en indice de TotalPartiel_ comme vous le proposez, rendrait les sorties illisibles.
Pour pallier à ce défaut, et pour me permettre de faire évoluer mes patterns, j'ai imaginé les regrouper dans un tableau que j'ai appelé var[i], ce qui me permet au fur et à mesure que j'avance dans la lecture de mon fichier d'entrée, d'enrichir les patterns de manière à regrouper, de plus en plus, les lignes correspondantes.
Auriez-vous une solution pour ce genre de problème ?
Me suis-je fait bien comprendre ?
Non, ce que je voulais dire, c'est qu'on a besoin d'avoir un exemple concret, AVANT => APRÈS, avec le vrai schéma correspondant à tes données (en modifiant les vraies données si celles-ci sont sensibles).
Chaque fois qu'on nous donne des exemples basiques, on se casse le luc à donner des solutions qu'on doit adapter (quand il ne faut pas tout refaire), parce que les exemples sont loin de la réalité.
Pour ton cas, je persiste à croire que tu n'as besoin que de awk pour faire ce que tu veux !
Chaque fois qu'on nous donne des exemples basiques, on se casse le luc à donner des solutions qu'on doit adapter (quand il ne faut pas tout refaire), parce que les exemples sont loin de la réalité.
Pour ton cas, je persiste à croire que tu n'as besoin que de awk pour faire ce que tu veux !