2) Dans le post ci-dessus, une solution (en Shell et non en Perl) a été donnée à ta question initiale. As-tu essayé de la comprendre et de la traduire en Perl ?
3) As-tu essayé de résoudre ce problème toi-même ?
Si c'est le cas, peux-tu nous livrer le résultat de ta réflexion et exposer les problèmes sur lesquels tu butes ?
A moins que tu attendes de ce forum qu'on fasse tout le travail à ta place sans que tu aies besoin de réfléchir :(
Je pense résoudre mon problème en cherchant seul sans que vous soyez obligé de vous y pencher comme je l'ai compris quand on post un message dans programmation Perl et qu'on se retrouve avec des solutions en Shell.
Tout va pour le mieux dans ce monde qui tourne vraiment de mieux en mieux.
Alors là, c'est vraiment le comble ! C'est vraiment l'hôpital qui se fout de la charité !
Tout le monde s'est penché sur ton problème sur deux posts différents, on t'a proposé plein de solutions dont la mienne, en Perl, dans le premier commentaire, et non seulement tu as le culot de te plaindre, mais en plus tu fais la morale aux gens, et tout cela parce que l'on te dit de rester sur le premier post !
Est-ce que tu as toi-même réfléchi avant de t'exprimer ?
Si tu ne trouves pas la solution, c'est parce qu'à la base, ton problème n'est pas clair dans ta propre tête :
En gros je veux avoir dans le fichier2 les lignes du fichier1 ayant le même 2ème mot (par exemple).
Ca veut dire quoi ? Tu veux pouvoir préciser quel mot dans la phrase tu veux examiner ? Chose qui n'était pas précisée jusque là et auquel cas il faut trier ton fichier à partir de cette position, ou bien tu veux que ça marche pour tous les mots dupliqués, auquel cas tu pourrais très bien te retrouver également avec :
Ma maison est rouge
mon toit doit etre rouge
Dans ce cas, il faut d'abord recenser tous les mots, et ensuite récupérer les lignes qui les contiennent. Es-tu sûr d'avoir pensé à tout cela auparavant ?
En plus, on t'a posé d'autres questions auxquelles tu n'as pas daigné répondre, telle que :"pourquoi spécialement en Perl". Enfin, la solution en shell que je t'ai filé implémente un algo qui fonctionne. Tu n'as plus qu'à l'adapter tel quel en Perl. Si tu ne sais pas le faire, tu utilises ce que je t'ai écrit dans mon premier commentaire (encore), et tu lis la doc !
J'ai trié mon fichier sur le champ qui m'intéresse et j'obtiens un nouveau fichier de ce type:
rouge
bleu
rouge
vert
Mon problème est que je ne sais pas comment balayer ce nouveau fichier et comparer les lignes pour qu'il me récupère
que les valeurs identiques?
Voilà ce que j'ai réussi à faire:
$file="c:\\table.txt";
# Ouvre le fichier, qui s'il n'existe pas
open(INFILE,$file) or die "Impossible de trouver le fichier $file\n";
while () {$string=$_;
if ($string=~ /M/){
@liste=substr($_, 6, 8);
open ("NEWFILE", ">>mont.txt") or die ("Impossible d'ouvrir le fic. mont.txt");
while (<@liste>) { print NEWFILE "$_\n" ;# Ecrit toutes les lignes dans mont.txt
}
}
}
Je souhaite faire du perl car je suis sur Windows.
Il faut lire ton fichier en deux passes, car autrement tu serais obligé de retenir en mémoire chaque ligne au cas où un de ses mots serait dupliqué. Par contre, tu n'es pas obligé de le réouvrir à chaque tour de boucle :
Je considère que :
- Les mots dont tu surveilles la duplication sont récupérés dans un champ avec substr($_, 6, 8). Voir plutôt du côté de split.
- Tu souhaites voir si chacun de ces mots se trouve dans l'intégralité des chaînes, dont les mots sont séparés par des espaces.
$in = "in.txt";
$out = "out.txt";
open(INFILE,$in);
while (<INFILE>) { $mots{substr($_, 6, 8)}++; }
close (INFILE);
open(INFILE,$in);
open(OUTFILE,">>$out");
while (<INFILE>)
{
$phrase = $_;
foreach (split(' ',$phrase))
{
if ($mots{$_} ge 2) { print $phrase; last }
}
}
# Reste au premier commentaire.
Posté par Obsidian . Évalué à 4.
https://linuxfr.org/forums/27/23394.html
2) RFTM
3) while (<>){ if ($_ =~ "Mot") { printf $_; } }
# Precision
Posté par milounix . Évalué à 1.
Fichier1:
Ma maison est rouge
mon toit doit etre bleu
ma cheminée fume
mon toit doit etre rouge
Je veux obtenir le fichier2 comme suit:
mon toit doit etre bleu
mon toit doit etre rouge
En gros je veux avoir dans le fichier2 les lignes du fichier1 ayant le même 2ème mot (par exemple).
Le tout en langage Perl
Merci
[^] # Re: Precision
Posté par netsurfeur . Évalué à 2.
https://linuxfr.org/forums/27/23394.html
2) Dans le post ci-dessus, une solution (en Shell et non en Perl) a été donnée à ta question initiale. As-tu essayé de la comprendre et de la traduire en Perl ?
3) As-tu essayé de résoudre ce problème toi-même ?
Si c'est le cas, peux-tu nous livrer le résultat de ta réflexion et exposer les problèmes sur lesquels tu butes ?
A moins que tu attendes de ce forum qu'on fasse tout le travail à ta place sans que tu aies besoin de réfléchir :(
[^] # Re: Precision
Posté par milounix . Évalué à 0.
Tout va pour le mieux dans ce monde qui tourne vraiment de mieux en mieux.
A bientôt, peut être avec la solution.....
Réfléchissez avant de vous exprimer...
[^] # Re: Precision
Posté par Obsidian . Évalué à 3.
Alors là, c'est vraiment le comble ! C'est vraiment l'hôpital qui se fout de la charité !
Tout le monde s'est penché sur ton problème sur deux posts différents, on t'a proposé plein de solutions dont la mienne, en Perl, dans le premier commentaire, et non seulement tu as le culot de te plaindre, mais en plus tu fais la morale aux gens, et tout cela parce que l'on te dit de rester sur le premier post !
Est-ce que tu as toi-même réfléchi avant de t'exprimer ?
Si tu ne trouves pas la solution, c'est parce qu'à la base, ton problème n'est pas clair dans ta propre tête :
Ca veut dire quoi ? Tu veux pouvoir préciser quel mot dans la phrase tu veux examiner ? Chose qui n'était pas précisée jusque là et auquel cas il faut trier ton fichier à partir de cette position, ou bien tu veux que ça marche pour tous les mots dupliqués, auquel cas tu pourrais très bien te retrouver également avec :
Ma maison est rouge
mon toit doit etre rouge
Dans ce cas, il faut d'abord recenser tous les mots, et ensuite récupérer les lignes qui les contiennent. Es-tu sûr d'avoir pensé à tout cela auparavant ?
En plus, on t'a posé d'autres questions auxquelles tu n'as pas daigné répondre, telle que :"pourquoi spécialement en Perl". Enfin, la solution en shell que je t'ai filé implémente un algo qui fonctionne. Tu n'as plus qu'à l'adapter tel quel en Perl. Si tu ne sais pas le faire, tu utilises ce que je t'ai écrit dans mon premier commentaire (encore), et tu lis la doc !
Réfléchis avant de t'exprimer !
[^] # Re: Precision
Posté par milounix . Évalué à 2.
rouge
bleu
rouge
vert
Mon problème est que je ne sais pas comment balayer ce nouveau fichier et comparer les lignes pour qu'il me récupère
que les valeurs identiques?
Voilà ce que j'ai réussi à faire:
$file="c:\\table.txt";
# Ouvre le fichier, qui s'il n'existe pas
open(INFILE,$file) or die "Impossible de trouver le fichier $file\n";
while () {$string=$_;
if ($string=~ /M/){
@liste=substr($_, 6, 8);
open ("NEWFILE", ">>mont.txt") or die ("Impossible d'ouvrir le fic. mont.txt");
while (<@liste>) { print NEWFILE "$_\n" ;# Ecrit toutes les lignes dans mont.txt
}
}
}
Je souhaite faire du perl car je suis sur Windows.
Merci
[^] # Re: Precision
Posté par Obsidian . Évalué à 3.
Il faut lire ton fichier en deux passes, car autrement tu serais obligé de retenir en mémoire chaque ligne au cas où un de ses mots serait dupliqué. Par contre, tu n'es pas obligé de le réouvrir à chaque tour de boucle :
Je considère que :
- Les mots dont tu surveilles la duplication sont récupérés dans un champ avec substr($_, 6, 8). Voir plutôt du côté de split.
- Tu souhaites voir si chacun de ces mots se trouve dans l'intégralité des chaînes, dont les mots sont séparés par des espaces.
$in = "in.txt";
$out = "out.txt";
open(INFILE,$in);
while (<INFILE>) { $mots{substr($_, 6, 8)}++; }
close (INFILE);
open(INFILE,$in);
open(OUTFILE,">>$out");
while (<INFILE>)
{
$phrase = $_;
foreach (split(' ',$phrase))
{
if ($mots{$_} ge 2) { print $phrase; last }
}
}
close(INFILE);
close(OUTFILE);
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.