Calcul de Sous totaux sous unix

Fermé
Jean Bôlida - 17 juil. 2012 à 21:59
dubcek Messages postés 18753 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 7 novembre 2024 - 18 juil. 2012 à 14:15
Bonjour,

Comment on fait si on veut avoir les résultats "sous totaux" en unix?

Ca passe bien sur excel en utilisant l'outil "sous totaux" mais on en a besoin sous unix pour automatiser dans un script et cron.

par exemple on a le fichier ci-dessous à traiter:

Heure Utilisateur Total
00:00 Éric 15
00:00 Jean 8
00:00 Freddy 18
00:05 Nathan 4
00:05 Robert 22
00:05 Honoré 21
00:10 Gérard 7
00:10 Marco 14
00:10 Gilbert 20

etc.....

et on veut avoir le résultat ci-dessous:

Total 00:00 41
Total 00:05 47
Total 00:10 41

etc...

Merci.
A voir également:

4 réponses

jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
Modifié par jisisv le 17/07/2012 à 23:26
Tu peux résoudre ceci facilement avc awk. Par exemple:
johand@osiris: ~/src/CCM/awk $ cat totaux.dat   
00:00 Éric 15  
00:00 Jean 8  
00:00 Freddy 18  
00:05 Nathan 4  
00:05 Robert 22  
00:05 Honoré 21  
00:10 Gérard 7  
00:10 Marco 14  
00:10 Gilbert 20   
johand@osiris: ~/src/CCM/awk $ cat totaux.sh  
#!/bin/sh  
awk  -F " "  '{SUMS[$1] += $3 ; } END {for (key in  SUMS) { printf("Total %s\t%04d\n", key, SUMS[key]); } }'  
johand@osiris: ~/src/CCM/awk $ sort -R totaux.dat  | ./totaux.sh   
Total 00:05 0047  
Total 00:00 0041  
Total 00:10 0041

Gates gave ^H sold you the windows.
GNU gave us the whole house.(Alexandrin)
1
dubcek Messages postés 18753 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 7 novembre 2024 5 619
18 juil. 2012 à 09:16
hello
en bash
$ declare -A x ; while read t n v ; do ((x[$t]+=$v)); done < fichier ; for t in ${!x[@]}; do echo Total $t ${x[$t]} ; done
Total 00:00 41
Total 00:05 47
Total 00:10 41
0
Jean Bôlida
18 juil. 2012 à 13:53
Bonjour

Merci beaucoup à tous pour vos aides, j'ai d'abord essayé avec la solution de "jisisv" et il semble OK mais j'ai fait sort -r au lieu de sort -R car -R est invalid.

Ainsi, si les valeurs dans le fichier "totaux.dat" contient des virgules, comment fait-on pour avoir aussi les sous totaux avec virgules?

Merci
0
dubcek Messages postés 18753 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 7 novembre 2024 5 619
18 juil. 2012 à 14:15
$ declare -A x ; while IFS=, read t n v ; do ((x[$t]+=$v)); done < fichier ; for t in ${!x[@]}; do echo Total $t ${x[$t]} ; done
0