[PERL]Comment supprimer des lignes en double dans un fichier ?
Résolu/Fermé
fxtaa
Messages postés
1050
Date d'inscription
mardi 20 octobre 2009
Statut
Membre
Dernière intervention
2 avril 2015
-
11 déc. 2013 à 11:51
fxtaa Messages postés 1050 Date d'inscription mardi 20 octobre 2009 Statut Membre Dernière intervention 2 avril 2015 - 11 déc. 2013 à 17:13
fxtaa Messages postés 1050 Date d'inscription mardi 20 octobre 2009 Statut Membre Dernière intervention 2 avril 2015 - 11 déc. 2013 à 17:13
A voir également:
- [PERL]Comment supprimer des lignes en double dans un fichier ?
- Double ecran - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier rar - Guide
- Impossible de supprimer un fichier - Guide
2 réponses
fxtaa
Messages postés
1050
Date d'inscription
mardi 20 octobre 2009
Statut
Membre
Dernière intervention
2 avril 2015
74
11 déc. 2013 à 17:13
11 déc. 2013 à 17:13
Superbe.
j'avais fait une boucle dans une boucle... c'était pas super opti.
Merci!
j'avais fait une boucle dans une boucle... c'était pas super opti.
Merci!
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
Modifié par [Dal] le 11/12/2013 à 14:09
Modifié par [Dal] le 11/12/2013 à 14:09
Salut fxtaa,
20000 lignes, ce n'est pas tant que cela, alors tu peux charger l'intégralité de ton fichier dans un array Perl et utiliser grep dessus pour les extractions. Ensuite, toujours avec grep, tu peux te servir de chaque extraction pour retirer les éléments de la liste ayant été extraits (dans l'exemple ci-dessous en créant un hash dont les clefs sont les éléments extraits).
Voilà ce que cela donne avec un fichier de départ que j'ai un peu complexifié pour vérifier le fonctionnement :
et un script comme celui-là :
cela produit :
Dal
20000 lignes, ce n'est pas tant que cela, alors tu peux charger l'intégralité de ton fichier dans un array Perl et utiliser grep dessus pour les extractions. Ensuite, toujours avec grep, tu peux te servir de chaque extraction pour retirer les éléments de la liste ayant été extraits (dans l'exemple ci-dessous en créant un hash dont les clefs sont les éléments extraits).
Voilà ce que cela donne avec un fichier de départ que j'ai un peu complexifié pour vérifier le fonctionnement :
$ cat fxtaa_fichier.txt
12.24.0.125;autre
1.1.1.1;toto.google.com
2.2.2.2;toto.google.com
3.3.3.3;tata.google.com
1.1.1.1;tutu.google.com
5.5.5.5;truc
5.5.5.5;truc
2.2.2.2;toto.google.com
et un script comme celui-là :
$ cat fxtaa.pl #!/usr/bin/perl use strict; use warnings; open FILE, '<', "fxtaa_fichier.txt" or die; my @array_all = <FILE>; close FILE; my $index = 0; print "dupliqués :\n"; while ($index < scalar @array_all) { $_ = $array_all[$index]; die("Erreur de format ligne $_") unless /^([0-9.]+)/; { my @matches = grep { /^$1/ } @array_all; if (scalar @matches > 1) { print @matches; my %h; @h{@matches} = undef; @array_all = grep {not exists $h{$_}} @array_all; } else { $index++; } } } print "non dupliqués :\n"; print @array_all;
cela produit :
$ ./fxtaa.pl
dupliqués :
1.1.1.1;toto.google.com
1.1.1.1;tutu.google.com
2.2.2.2;toto.google.com
2.2.2.2;toto.google.com
5.5.5.5;truc
5.5.5.5;truc
non dupliqués :
12.24.0.125;autre
3.3.3.3;tata.google.com
Dal