Menu

Faire une somme ligne par ligne et par date de deux fichiers [Résolu/Fermé]

Messages postés
558
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
19 juin 2019
- - Dernière réponse : dubcek
Messages postés
17776
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
22 juillet 2019
- 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


Afficher la suite 

11 réponses

Messages postés
17776
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
22 juillet 2019
4391
0
Merci
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
Messages postés
558
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
19 juin 2019
16
0
Merci
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.

dubcek
Messages postés
17776
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
22 juillet 2019
4391 -
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
Messages postés
558
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
19 juin 2019
16
0
Merci
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!
Messages postés
17776
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
22 juillet 2019
4391
0
Merci
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
Messages postés
558
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
19 juin 2019
16
0
Merci
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

dubcek
Messages postés
17776
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
22 juillet 2019
4391 -
les données correspondent avec celles en exemple dans le post 1 ?
essayer avec nawk
Messages postés
558
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
19 juin 2019
16
0
Merci
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.
dubcek
Messages postés
17776
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
22 juillet 2019
4391 -
montre les données
Messages postés
558
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
19 juin 2019
16
0
Merci
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..
dubcek
Messages postés
17776
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
22 juillet 2019
4391 -
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
$
Messages postés
558
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
19 juin 2019
16
0
Merci
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!
dubcek
Messages postés
17776
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
22 juillet 2019
4391 -
quelle version ?
awk -W version
ou
awk --version
Messages postés
558
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
19 juin 2019
16
0
Merci
Voici ma version : mawk 1.3.3 Nov 1996
dubcek
Messages postés
17776
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
22 juillet 2019
4391 -
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
Messages postés
558
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
19 juin 2019
16
0
Merci
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.
zipe31
Messages postés
36636
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
22 juillet 2019
3724 -
Salut,

Est-ce que tes fichiers csv sont bien au format Unix ?
dubcek
Messages postés
17776
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
22 juillet 2019
4391 -
ou une vieille commande sort
Messages postés
558
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
19 juin 2019
16
0
Merci
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.
dubcek
Messages postés
17776
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
22 juillet 2019
4391 -
.csv ... la signature du mal ...
si awk pointe sur mawk, plutot utiliser gawk