PERL - Calcul colonne de deux fichiers

Résolu/Fermé
wafa_o Messages postés 109 Date d'inscription mercredi 16 juillet 2008 Statut Membre Dernière intervention 4 janvier 2011 - 9 mars 2010 à 12:50
wafa_o Messages postés 109 Date d'inscription mercredi 16 juillet 2008 Statut Membre Dernière intervention 4 janvier 2011 - 9 mars 2010 à 16:25
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.
A voir également:

15 réponses

dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
9 mars 2010 à 13:17
hello
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   
$
0
wafa_o Messages postés 109 Date d'inscription mercredi 16 juillet 2008 Statut Membre Dernière intervention 4 janvier 2011 2
9 mars 2010 à 14:25
Ca fonctionne seulement je voudrais réaliser que ce soit fait en script PERL ....
0
wafa_o Messages postés 109 Date d'inscription mercredi 16 juillet 2008 Statut Membre Dernière intervention 4 janvier 2011 2
9 mars 2010 à 15:11
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.
0
fxtaa Messages postés 1050 Date d'inscription mardi 20 octobre 2009 Statut Membre Dernière intervention 2 avril 2015 74
9 mars 2010 à 15:19
salut ,

tu multiplies par 100 apres c est ca ?
0

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

Posez votre question
wafa_o Messages postés 109 Date d'inscription mercredi 16 juillet 2008 Statut Membre Dernière intervention 4 janvier 2011 2
9 mars 2010 à 15:22
Salut, oui c'est ca, je divise et je multiplie par 100.
0
fxtaa Messages postés 1050 Date d'inscription mardi 20 octobre 2009 Statut Membre Dernière intervention 2 avril 2015 74
9 mars 2010 à 15:35
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....
0
fxtaa Messages postés 1050 Date d'inscription mardi 20 octobre 2009 Statut Membre Dernière intervention 2 avril 2015 74
9 mars 2010 à 15:44
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 ?
0
wafa_o Messages postés 109 Date d'inscription mercredi 16 juillet 2008 Statut Membre Dernière intervention 4 janvier 2011 2
9 mars 2010 à 15:47
En fonction de la date, il vaut mieux être prudent ;)
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
9 mars 2010 à 15:48
$ 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   
$ 
$ 
0
fxtaa Messages postés 1050 Date d'inscription mardi 20 octobre 2009 Statut Membre Dernière intervention 2 avril 2015 74
9 mars 2010 à 15:58
joli, mais bon tu triches un peu quand même ^^
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615 > fxtaa Messages postés 1050 Date d'inscription mardi 20 octobre 2009 Statut Membre Dernière intervention 2 avril 2015
9 mars 2010 à 16:01
oui, mais c'était pour répondre au post #3
0
fxtaa Messages postés 1050 Date d'inscription mardi 20 octobre 2009 Statut Membre Dernière intervention 2 avril 2015 74 > dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024
9 mars 2010 à 16:03
bon, ca va alors... mais que je t'y reprenne plus !
0
wafa_o Messages postés 109 Date d'inscription mercredi 16 juillet 2008 Statut Membre Dernière intervention 4 janvier 2011 2
9 mars 2010 à 16:25
Merci pour ton aide dubcek.
Je vais utiliser le code de fxtaa.
0
fxtaa Messages postés 1050 Date d'inscription mardi 20 octobre 2009 Statut Membre Dernière intervention 2 avril 2015 74
9 mars 2010 à 15:55
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";
		}
	}
}	

0
wafa_o Messages postés 109 Date d'inscription mercredi 16 juillet 2008 Statut Membre Dernière intervention 4 janvier 2011 2
9 mars 2010 à 16:07
Il ne me reste plus qu'à comprendre quelques unes de tes lignes:
Tu peux m'expliquer ?
$/ = "66210-34" ;
0
wafa_o Messages postés 109 Date d'inscription mercredi 16 juillet 2008 Statut Membre Dernière intervention 4 janvier 2011 2
9 mars 2010 à 16:16
Merciiiiiiiiiiiiiiii beaucoup. Je l'ai adapté car le nom des machines changeait.

Une épine de mon pied en moins :)
0
fxtaa Messages postés 1050 Date d'inscription mardi 20 octobre 2009 Statut Membre Dernière intervention 2 avril 2015 74
9 mars 2010 à 16:17
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é...)
0
wafa_o Messages postés 109 Date d'inscription mercredi 16 juillet 2008 Statut Membre Dernière intervention 4 janvier 2011 2
9 mars 2010 à 16:24
Ok je regarderai de mon côté si je trouve quelque chose sinon tant pis.
Au point où j'en suis, je vais pas être difficile :)

Bonne fin de journée
0
wafa_o Messages postés 109 Date d'inscription mercredi 16 juillet 2008 Statut Membre Dernière intervention 4 janvier 2011 2
9 mars 2010 à 15:39
Si je confirme l'avant dernière colonne correspond à la date.
Ici le n° de ref ( je l'ai appelé comme ca) mais ce numéro de référence est le numéro de semaine ...

Je te remercie pour ton aide fxtaa
-1