Faire une somme ligne par ligne et par date de deux fichiers

Résolu/Fermé
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 - 11 mars 2015 à 09:18
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 - 12 mars 2015 à 10:04
Bonjour,
J'ai deux fichiers qui contiennent les champs suivants :

Fichier1
22;16;01/2010
28;21;02/2010
54;19;03/2010
48;61;04/2010
14;69;01/2011
28;71;02/2011
etc..

Fichier2
29;13;01/2010
45;26;02/2010
34;39;03/2010
28;71;04/2010
44;39;01/2011
88;91;02/2011
etc..

J'aurais besoin via mon script bash de consolider le contenu de ces deux fichiers par date afin de faire la somme des deux premiers champs pour n'avoir q'un seul fichier suivant :

Fichier final
51;29;01/2010
73;47;02/2010
88;58;03/2010
76;132;04/2010
58;108;01/2011
116;162;02/2011
etc..

Une idée comme je dois faire?
Merci


A voir également:

11 réponses

dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié par dubcek le 11/03/2015 à 10:19
hello
$ awk -F ";" '{t1[$3]+=$1; t2[$3]+=$2} END {for (n in t1)print t1[n] FS t2[n] FS n}' fichier1 fichier2 | sort -t ";" -k 3.4,3.7 -k 3.1,3.2
51;29;01/2010
73;47;02/2010
88;58;03/2010
76;132;04/2010
58;108;01/2011
116;162;02/2011
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
11 mars 2015 à 10:14
Merci dubcek.

J'utilise awk mais pas aussi pousser. Je comprends parfaitement le -F qui est le séparateur mais après je comprends pas grand chose!

Pour le sort je comprends également.

0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié par dubcek le 11/03/2015 à 10:29
j'ai changé le sort
t1[$3]+=$1 dans t1 indexé par la date MM/AAAA on additionne les champs 1
t2[$3]+=$2 même chose pour le champ 2
for (n in t1) on liste tout les index de t1, donc la liste des dates
print t1[n] FS t2[n] FS n et on affiche somme des champs 1, somme des champs 2 et la date
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
11 mars 2015 à 10:47
Ok c'est plus clair.

Pour le sort je viens de tester je ne vois pas de différence entre ton premier sort et ton second!
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
11 mars 2015 à 11:09
avec sort -t "/" -k 2
51;29;01/2010
73;47;02/2010
76;132;04/2010
88;58;03/2010

116;162;02/2011
58;108;01/2011

avec sort -t ";" -k 3.4,3.7 -k 3.1,3.2
51;29;01/2010
73;47;02/2010
88;58;03/2010
76;132;04/2010

58;108;01/2011
116;162;02/2011
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
11 mars 2015 à 12:21
Ok merci.

Par contre cela ne fonctionne pas. En effet j'ai pas l'addition des deux fichiers dans le fichier3 mais une ligne du premier fichier puis une ligne du second fichier comme ceci :

1282;459;01/2010 <== fichier1
22;16;01/2010 <==fichier2
1269;459;02/2010 <== fichier1
28;21;02/2010 <== fichier2
etc..

Lorsque j'execute a la main la commande AWK j'ai la même chose :

awk -F ";" '{t1[$3]+=$1; t2[$3]+=$2} END {for (n in t1)print t1[n] FS t2[n] FS n}' fichier1 fichier2 | sort -t ";" -k 3.4,3.7 -k 3.1,3.2 > fichier3

0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
11 mars 2015 à 14:03
les données correspondent avec celles en exemple dans le post 1 ?
essayer avec nawk
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
11 mars 2015 à 14:46
Oui les données correspondent.

Avec nawk c'est pareil.

Petite précision les champs 1 et 2 peuvent être composés de nombres ayant 2,3,4 chiffres.
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
11 mars 2015 à 14:53
montre les données
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
11 mars 2015 à 15:50
Fichier1

1282;459;01/2010
1269;459;02/2010
1637;491;03/2010
1442;473;04/2010
1141;459;05/2010
1254;462;06/2010
1069;430;07/2010
864;370;08/2010
1324;450;09/2010
1238;453;10/2010
1186;441;11/2010
872;369;12/2010
1156;438;01/2011
1249;454;02/2011
1443;473;03/2011
1275;472;04/2011
1223;474;05/2011
1139;452;06/2011
etc..

Fichier2

22;16;01/2010
28;21;02/2010
53;29;03/2010
36;21;04/2010
27;18;05/2010
35;20;06/2010
19;16;07/2010
21;16;08/2010
39;25;09/2010
34;19;10/2010
35;24;11/2010
25;17;12/2010
32;24;01/2011
44;23;02/2011
28;21;03/2011
41;28;04/2011
46;25;05/2011
51;31;06/2011
62;31;07/2011
60;28;08/2011
79;37;09/2011
81;37;10/2011
76;38;11/2011
54;23;12/2011
79;40;01/2012
74;42;02/2012
etc..
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
11 mars 2015 à 16:10
j'ai ça comme résultat
$ awk -F ";" '{t1[$3]+=$1; t2[$3]+=$2} END {for (n in t1)print t1[n] FS t2[n] FS n}' fic1 fic2 | sort -t ";" -k 3.4,3.7 -k 3.1,3.2
1304;475;01/2010
1297;480;02/2010
1690;520;03/2010
1478;494;04/2010
1168;477;05/2010
1289;482;06/2010
1088;446;07/2010
885;386;08/2010
1363;475;09/2010
1272;472;10/2010
1221;465;11/2010
897;386;12/2010
1188;462;01/2011
1293;477;02/2011
1471;494;03/2011
1316;500;04/2011
1269;499;05/2011
1190;483;06/2011
62;31;07/2011
60;28;08/2011
79;37;09/2011
81;37;10/2011
76;38;11/2011
54;23;12/2011
79;40;01/2012
74;42;02/2012
$
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
11 mars 2015 à 16:36
Peut être que le souci vient de la version de ma distrib qui est une 2.6 sur ma machine de test et qui n'interprète pas le AWK correctement!
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
11 mars 2015 à 17:06
quelle version ?
awk -W version
ou
awk --version
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
12 mars 2015 à 06:47
Voici ma version : mawk 1.3.3 Nov 1996
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié par dubcek le 12/03/2015 à 08:19
effectivement, vieil awk, essayer gawk
je vais tester avec mawk
mawk 1.3.3 et GNU Awk 3.1.6 me retournent les mêmes résultats
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
Modifié par pcsystemd le 12/03/2015 à 08:53
J'ai essayé avec gawk mais pareil.

Ce qui est curieux, c'est que si je lance la commande suivante :

awk -F ";" '{t1[$3]+=$1; t2[$3]+=$2} END {for (n in t1)print t1[n] FS t2[n] FS n}' fichier1 fichier2 | sort -t ";" -k 3.4,3.7 -k 3.1,3.2


Cela fonctionne en utilisant fichier1 et fichier2, par contre si j'utilise mes vrais noms de fichiers comme ci-dessous cela ne fonctionne pas!

awk -F ";" '{t1[$3]+=$1; t2[$3]+=$2} END {for (n in t1)print t1[n] FS t2[n] FS n}' mois_tmp_20150312.csv mois_autres_20150312.csv | sort -t ";" -k 3.4,3.7 -k 3.1,3.2


L'accès au savoir est la première liberté que chaque homme devrait avoir.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
12 mars 2015 à 09:01
Salut,

Est-ce que tes fichiers csv sont bien au format Unix ?
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
12 mars 2015 à 09:09
ou une vieille commande sort
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
Modifié par pcsystemd le 12/03/2015 à 09:46
Salut zipe31,

Effectivement un des fichiers est crée sous Windows et je le récupère sur ma machine sous environnement Débian donc Unix pour traitement ce qui pourrait être le souci!

Bon finalement j'ai converti mon fichier au format Unix comment suite :

sed 's/\x0D$//' fichier1 > fichier2


et maintenant cela fonctionne.

Merci a vous deux

L'accès au savoir est la première liberté que chaque homme devrait avoir.
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié par dubcek le 12/03/2015 à 10:05
.csv ... la signature du mal ...
si awk pointe sur mawk, plutot utiliser gawk
0