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

Résolu
pcsystemd Messages postés 702 Date d'inscription   Statut Membre Dernière intervention   -  
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   -
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 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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 702 Date d'inscription   Statut Membre Dernière intervention   23
 
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 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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 702 Date d'inscription   Statut Membre Dernière intervention   23
 
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 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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 702 Date d'inscription   Statut Membre Dernière intervention   23
 
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 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
les données correspondent avec celles en exemple dans le post 1 ?
essayer avec nawk
0
pcsystemd Messages postés 702 Date d'inscription   Statut Membre Dernière intervention   23
 
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 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
montre les données
0
pcsystemd Messages postés 702 Date d'inscription   Statut Membre Dernière intervention   23
 
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 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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 702 Date d'inscription   Statut Membre Dernière intervention   23
 
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 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
quelle version ?
awk -W version
ou
awk --version
0
pcsystemd Messages postés 702 Date d'inscription   Statut Membre Dernière intervention   23
 
Voici ma version : mawk 1.3.3 Nov 1996
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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 702 Date d'inscription   Statut Membre Dernière intervention   23
 
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   Statut Contributeur Dernière intervention   6 431
 
Salut,

Est-ce que tes fichiers csv sont bien au format Unix ?
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
ou une vieille commande sort
0
pcsystemd Messages postés 702 Date d'inscription   Statut Membre Dernière intervention   23
 
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 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
.csv ... la signature du mal ...
si awk pointe sur mawk, plutot utiliser gawk
0