Comparer et trier

Fermé
romain - 27 sept. 2013 à 15:45
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 - 27 sept. 2013 à 19:16
Bonjour,

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

2 réponses

[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
27 sept. 2013 à 17:31
le "prénom" dont tu parles n'est pas "popo" ?
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié par [Dal] le 27/09/2013 à 18:55
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 :
toto:Tata/tutu\Prenom1=popo
et 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
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié par [Dal] le 27/09/2013 à 19:20
Comme cela, par exemple :

#!/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
0