Comparer et trier
romain
-
[Dal] Messages postés 6373 Statut Contributeur -
[Dal] Messages postés 6373 Statut Contributeur -
Bonjour,
J'ai deux fichiers :
Fichier 1 :
Fichier 2 :
Mon but est de supprimer du fichier 1 les lignes dont le prénom ne figurent pas dans le fichier 2 !
Dans cet exemple, la ligne contenant "Prénom2" dans le fichier 1 devrait être supprimée.
Vous remarquerez que les toto/Tata etc et les caractères sont factices, c'est juste pour montrer qu'il peut y avoir tous les symboles dans le fichier 1. En revanche dans le fichier 2, seulement les prénoms, un seul par ligne.
J'imagine qu'avec diff et sed ça doit pouvoir se faire, mais j'y suis depuis ce matin et je n'y arrive pas.
A+
Romain
J'ai deux fichiers :
Fichier 1 :
toto:Tata/tutu\Prenom1=popo
tata:Toto/titi\Prenom2=popo
youyou:Toto/titi\Prenom3=popo
[...50000 lignes]
Fichier 2 :
Prenom1
Prenom3
Prenom4
[...20000 lignes...]
Mon but est de supprimer du fichier 1 les lignes dont le prénom ne figurent pas dans le fichier 2 !
Dans cet exemple, la ligne contenant "Prénom2" dans le fichier 1 devrait être supprimée.
Vous remarquerez que les toto/Tata etc et les caractères sont factices, c'est juste pour montrer qu'il peut y avoir tous les symboles dans le fichier 1. En revanche dans le fichier 2, seulement les prénoms, un seul par ligne.
J'imagine qu'avec diff et sed ça doit pouvoir se faire, mais j'y suis depuis ce matin et je n'y arrive pas.
A+
Romain
A voir également:
- Comparer et trier
- Excel trier par ordre croissant chiffre - Guide
- Logiciel pour trier les photos automatiquement - Guide
- Comparer prix amazon - Guide
- Meilleur prix Amazon : payer moins cher avec Amazin'Europe - Accueil - Commerce
- Comparer pdf - Télécharger - PDF
2 réponses
Salut romain,
Tu peux faire cela assez simplement avec Perl, en :
- mettant chaque terme extrait des lignes de fichier 2 dans un hash dont la clef est chaque terme "Prenom1", "Prenom2", etc.
- en capturant dans chaque ligne du fichier 1 l'endroit où se trouve le "Prenom", avec la regexp suivante :
- et en vérifiant si la clef existe ou pas dans le hash pour déterminer, et envoyer la ligne vers le fichier comportant les données extraites si elle existe
La regexp ci-dessus suppose que ce soit bien "Prenom1", et non pas "popo" que tu veuilles matcher dans :
Dal
Tu peux faire cela assez simplement avec Perl, en :
- mettant chaque terme extrait des lignes de fichier 2 dans un hash dont la clef est chaque terme "Prenom1", "Prenom2", etc.
- en capturant dans chaque ligne du fichier 1 l'endroit où se trouve le "Prenom", avec la regexp suivante :
/.+?:.+?\/.+?\\(.+?)=.+/
- et en vérifiant si la clef existe ou pas dans le hash pour déterminer, et envoyer la ligne vers le fichier comportant les données extraites si elle existe
La regexp ci-dessus suppose que ce soit bien "Prenom1", et non pas "popo" que tu veuilles matcher dans :
toto:Tata/tutu\Prenom1=popoet que les caractères : / \ = soient des caractères séparateurs sur lesquels on peut se baser et qu'ils ne se retrouvent pas dans les champs, et que ces champs comportent au moins un caractère.
Dal
Comme cela, par exemple :
ce qui donne, sur ton exemple :
Dal
#!/usr/bin/perl
use strict;
use warnings;
open FILE2, "fichier2.txt" or die;
my %hash;
while (my $prenom=<FILE2>) {
chomp($prenom);
$hash{$prenom} = 1;
}
open FILE1, "fichier1.txt" or die;
while(<FILE1>) {
if (/.+?:.+?\/.+?\\(.+?)=.+/) {
if ($hash{$1}) {
print $_;
}
} else {
print "Erreur de format, ligne numéro $. : $_\n";
exit;
}
}
ce qui donne, sur ton exemple :
toto:Tata/tutu\Prenom1=popo
youyou:Toto/titi\Prenom3=popo
Dal