PERL - Calcul colonne de deux fichiers
Résolu
wafa_o
Messages postés
109
Date d'inscription
Statut
Membre
Dernière intervention
-
wafa_o Messages postés 109 Date d'inscription Statut Membre Dernière intervention -
wafa_o Messages postés 109 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'ai besoin d'aide. Voici mon problème.
J'ai deux fichiers de format :
1er fichier : premier.txt
Machine1 01 100104 155076
Machine2 01 100105 153820
Machine2 01 100106 187736
Machine2 01 100107 180004
Machine3 01 100108 157936
2ème fichier: second.txt
Machine1 01 100104 175820
Machine2 01 100105 201532
Machine2 01 100106 458213
Machine2 01 100107 123650
Machine3 01 100108 136258
Pour les deux fichiers :
La colonne 1 correspond au nom de la machine,
La colonne 2 correspond à un N° ref,
La colonne 3 correspond à la date,
La colonne 4 correspond à la valeur,
Je souhaiterais faire un calcul sur les valeurs des deux fichiers : Diviser la valeur du second fichier par la valeur du premier. Puis multiplier le tout.
Le fichier de sortie serait:
Machine1 01 100104 113,37
Machine2 01 100105 1310,18
Machine2 01 100106 244,07
Machine2 01 100107 68,69
Machine3 01 100108 86,27
Sachant qu'il faut faire attention à effectuer le calcul pour le même nom de la machine, n° de ref et date.
Merci d'avance.
J'ai besoin d'aide. Voici mon problème.
J'ai deux fichiers de format :
1er fichier : premier.txt
Machine1 01 100104 155076
Machine2 01 100105 153820
Machine2 01 100106 187736
Machine2 01 100107 180004
Machine3 01 100108 157936
2ème fichier: second.txt
Machine1 01 100104 175820
Machine2 01 100105 201532
Machine2 01 100106 458213
Machine2 01 100107 123650
Machine3 01 100108 136258
Pour les deux fichiers :
La colonne 1 correspond au nom de la machine,
La colonne 2 correspond à un N° ref,
La colonne 3 correspond à la date,
La colonne 4 correspond à la valeur,
Je souhaiterais faire un calcul sur les valeurs des deux fichiers : Diviser la valeur du second fichier par la valeur du premier. Puis multiplier le tout.
Le fichier de sortie serait:
Machine1 01 100104 113,37
Machine2 01 100105 1310,18
Machine2 01 100106 244,07
Machine2 01 100107 68,69
Machine3 01 100108 86,27
Sachant qu'il faut faire attention à effectuer le calcul pour le même nom de la machine, n° de ref et date.
Merci d'avance.
A voir également:
- PERL - Calcul colonne de deux fichiers
- Déplacer colonne excel - Guide
- Comment faire deux colonnes sur word - Guide
- Trier colonne excel - Guide
- Formule somme excel colonne - Guide
- Calcul moyenne excel - Guide
15 réponses
hello
et avec awk ?
et avec awk ?
$ head a1 a2 ==> a1 <== Machine1 01 100104 155076 Machine2 01 100105 153820 Machine2 01 100106 187736 Machine2 01 100107 180004 Machine3 01 100108 157936 ==> a2 <== Machine1 01 100104 175820 Machine2 01 100105 201532 Machine2 01 100106 458213 Machine2 01 100107 123650 Machine3 01 100108 136258 $ $ cat a2 a1 |awk '{if(y=x[$1,$3])printf("%s %s %s %-8.2f\n", $1, $2, $3, (y/$4)*100);else x[$1,$3]=$4}' Machine1 01 100104 113.38 Machine2 01 100105 131.02 Machine2 01 100106 244.07 Machine2 01 100107 68.69 Machine3 01 100108 86.27 $
J'ai essayé ca ....
open (output, ">>essai") or die "Probleme ouverture:$!\n";
system("cat a2 a1 |awk '{if(y=x[$1,$3])print ouput ("%s %s %s %-8.2f\n", \$1, \$2, \$3, (y/$4)*100);else x[$1,$3]=$4}'");
close (output);
Mais ca ne fonctionne pas.
Help please.
open (output, ">>essai") or die "Probleme ouverture:$!\n";
system("cat a2 a1 |awk '{if(y=x[$1,$3])print ouput ("%s %s %s %-8.2f\n", \$1, \$2, \$3, (y/$4)*100);else x[$1,$3]=$4}'");
close (output);
Mais ca ne fonctionne pas.
Help please.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Ca arrive mais il y a quelques choses qui m'embête, tu es sur que l'avant derniere colonne est la date et non le Numéro de ref, car la, toutes tes machines ont le meme numero de ref....
Ok, concernant les contraintes :
tu veux du ligne par ligne "je prend la ligne 1 de fic1 et je bosse sur la ligne 1 du fic2" ou je me sert de la date en considérant celle ci comme unique ?
tu veux du ligne par ligne "je prend la ligne 1 de fic1 et je bosse sur la ligne 1 du fic2" ou je me sert de la date en considérant celle ci comme unique ?
$ perl -e "system('cat a2 a1 |awk \'{if(y=x[\$1,\$3])printf(\"%s %s %s %-8.2f\n\", \$1, \$2, \$3, (y/\$4)*100);else x[\$1,\$3]=\$4}\'')" Machine1 01 100104 113.38 Machine2 01 100105 131.02 Machine2 01 100106 244.07 Machine2 01 100107 68.69 Machine3 01 100108 86.27 $ $
open(FILE, "<bil1.txt"); while(<FILE>){ push(@lignes,$_); } close(FILE); $/ = "66210-34" ; open ( FILE , "<bil2.txt" ); my $fic2 = <FILE> ; close ( FILE ) ; $/ = "\n"; for(@lignes){ $fic1 = $_; if ($fic1 =~ /(Machine\d* \d*) (\d*) (\d*)/){ $reste = $1; $id1 = $2; $value1 = $3; if ($fic2 =~ /Machine\d* \d* $id1 (\d*)/){ $value2 = $1; $result = $value2 / $value1; $result *= 100; print "$reste $id1 $result\n"; } } }
Il ne me reste plus qu'à comprendre quelques unes de tes lignes:
Tu peux m'expliquer ?
$/ = "66210-34" ;
Tu peux m'expliquer ?
$/ = "66210-34" ;
Merciiiiiiiiiiiiiiii beaucoup. Je l'ai adapté car le nom des machines changeait.
Une épine de mon pied en moins :)
Une épine de mon pied en moins :)
Au risque de te décevoir je me souviens plus trop, c est une astuce que j'ai trouvé dans un vieux code et qui est vachement pratique !
Ça permet d'avoir tout le contenu d'un fichier dans un variable type $. Si je me trompe le "66210-34" est une valeur qui lorsqu'elle est atteinte entraine un retour à la ligne. (je suis aller chercher sur google j'ai rien trouvé...)
Ça permet d'avoir tout le contenu d'un fichier dans un variable type $. Si je me trompe le "66210-34" est une valeur qui lorsqu'elle est atteinte entraine un retour à la ligne. (je suis aller chercher sur google j'ai rien trouvé...)