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 -
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
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:
- Faire une somme ligne par ligne et par date de deux fichiers
- Partage de photos en ligne - Guide
- Formule somme excel ligne - Guide
- Mètre en ligne - Guide
- Aller à la ligne excel - Guide
- Formulaire en ligne de meta - Guide
11 réponses
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
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.
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.
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!
Pour le sort je viens de tester je ne vois pas de différence entre ton premier sort et ton second!
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 :
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
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.
Avec nawk c'est pareil.
Petite précision les champs 1 et 2 peuvent être composés de nombres ayant 2,3,4 chiffres.
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..
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..
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
$
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!
J'ai essayé avec gawk mais pareil.
Ce qui est curieux, c'est que si je lance la commande suivante :
Cela fonctionne en utilisant fichier1 et fichier2, par contre si j'utilise mes vrais noms de fichiers comme ci-dessous cela ne fonctionne pas!
L'accès au savoir est la première liberté que chaque homme devrait avoir.
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.
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 :
et maintenant cela fonctionne.
Merci a vous deux
L'accès au savoir est la première liberté que chaque homme devrait avoir.
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.