Comment utiliser, dans un script sh, des variables créées dans un script gawk

Fermé
zigroful Messages postés 20 Date d'inscription dimanche 16 février 2020 Statut Membre Dernière intervention 29 août 2023 - Modifié le 16 févr. 2020 à 18:04
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 17 févr. 2020 à 07:49
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:
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:

3 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
16 févr. 2020 à 18:18
Salut,

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


0
zigroful Messages postés 20 Date d'inscription dimanche 16 février 2020 Statut Membre Dernière intervention 29 août 2023
16 févr. 2020 à 18:20
Merci zip31 mais comment faire le total des totaux partiels ?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
16 févr. 2020 à 18:29
$ awk -F";" '{array[$2]+=$3;sum+=$3}END{for (name in array) {print "TotalPartiel_"name," = ", array[name]} {print "Total = ",sum}}' f1 
TotalPartiel_ a1 = 21.6
TotalPartiel_ a19 = 45
TotalPartiel_ a2 = 9.68
TotalPartiel_ a3 = 42
TotalPartiel_ a4 = 2.6
TotalPartiel_ a7 = 12.7
Total = 133.58
0
zigroful Messages postés 20 Date d'inscription dimanche 16 février 2020 Statut Membre Dernière intervention 29 août 2023 > zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021
16 févr. 2020 à 19:07
Bonjour zipe31,
la commande {print "Total = ",sum} que je viens d'expérimenter
ne fonctionne pas, chez moi. J'ai toujours Total=0
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407 > zigroful Messages postés 20 Date d'inscription dimanche 16 février 2020 Statut Membre Dernière intervention 29 août 2023
16 févr. 2020 à 19:16
sum est déclarée ?
0
zigroful Messages postés 20 Date d'inscription dimanche 16 février 2020 Statut Membre Dernière intervention 29 août 2023 > zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021
16 févr. 2020 à 19:53
Oui je l'ai déclarée avec declare sum avant d'appliquer awk dans mon script sh
0
zigroful Messages postés 20 Date d'inscription dimanche 16 février 2020 Statut Membre Dernière intervention 29 août 2023
16 févr. 2020 à 18:52
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 ?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
16 févr. 2020 à 19:17
Pour pouvoir aider on ne peut pas se satisfaire d'approximation ;-(
0
zigroful Messages postés 20 Date d'inscription dimanche 16 février 2020 Statut Membre Dernière intervention 29 août 2023 > zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021
16 févr. 2020 à 19:50
Vous avez raison. Disons, pour faire court, que les patterns sont des éléments d'un tableau unidimensionnel du type var[1]="a1"
var[2]="a2"
var[3]="a3"
etc...
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407 > zigroful Messages postés 20 Date d'inscription dimanche 16 février 2020 Statut Membre Dernière intervention 29 août 2023
17 févr. 2020 à 07:49
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 !
0