Bonjour, dans le cadre d'un cours de programmation j'ai à réaliser un script awk effectuant un tri et des calculs simples.
L'énnoncé; sur base d'une liste (exemple) ; Ville;prénom;nombre
Hannut;Pol;1200
Hannut;Sabine;120
Jodoigne;Rudy;100
Wavre;Caroline;1500
Wavre;Didier;200
Wavre;Thomas;1200
Trier sur le champ ville les lignes ayant ce premier champ identique et additionner les nombre du 3e champ.
Résultat attendu ;
wavre 2900
1 Caroline 1500
2 Didier 200
3 Thomas 1200
Hannut 1320
1 Pol 1200
2 Sabine 120
Jodoigne 100
1 Rudy 100
voilà mon script awk ;
Pour lancer le tri; awk -f script.awk liste.txtCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69 BEGIN { FS=";"; cpta=0; cptb=0; cptc=0; } suma=0; sumb=0; sumc=0; $1 == "Wavre" { grpA[cpta] = $2 " " $3; for(i=3;i<=NF;i++) { suma += $i; } sommea[cpta] = suma; cpta++; } $1 == "Hannut" { grpB[cptb] = $2 " " $3; for(i=3;i<=NF;i++) { sumb += $i; } sommeb[cptb] = sumb; cptb++; } $1 == "Jodoigne" { grpC[cptc] = $2 " " $3; for(i=3;i<=NF;i++) { sumc += $i; } sommec[cptc] = sumc; cptc++; } END { tota=0; totb=0; totc=0; print"\n-----------------------" for(i=0;i<cpta;i++) {tota += sommea[i]} print "\nwavre " tota "\t" for(i=0;i<cpta;i++){print " " i+1 " " grpA[i] "\t" } for(i=0;i<cptb;i++) {totb += sommeb[i]} print "\nHannut " totb "\t" for(i=0;i<cptb;i++){print " " i+1 " " grpB[i] "\t" } for(i=0;i<cptc;i++) {totc += sommec[i]} print "\nJodoigne " totc "\t" for(i=0;i<cptc;i++){print " " i+1 " " grpC[i] "\t" } print "\n------------------------" }
Bon cela fonctionne.... MAIS l'astuce serait d'obtenir un awk pouvant servir pour d'autre liste de données de type : Ville;prénom;nombre. Et donc de passer outre les $1 == "tel nom de ville" .Je débute dans la progra sous awk et je ne parviens pas à trouver un moyen de déclarer mes champs subissant le tri d'une autre facon.
Un grand merci pour votre aide!