[PERL]Comment supprimer des lignes en double dans un fichier ?
Résolu
fxtaa
Messages postés
1050
Date d'inscription
Statut
Membre
Dernière intervention
-
fxtaa Messages postés 1050 Date d'inscription Statut Membre Dernière intervention -
fxtaa Messages postés 1050 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je souhaiterai supprimer les lignes avec l'ip en double dans un fichier, ainsi que la ligne qui possède des doublons.
Par exemple dans mon fichier:
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
fichier après traitement :
2.2.2.2;toto.google.com
3.3.3.3;tata.google.com
fichier duplicate :
1.1.1.1;toto.google.com
1.1.1.1;tutu.google.com
Ce n'est donc pas qu'une simple suppression de doublon et je ne vois pas trop comment faire. Mon fichier fait environ 20 000 lignes.
Merci.
Je souhaiterai supprimer les lignes avec l'ip en double dans un fichier, ainsi que la ligne qui possède des doublons.
Par exemple dans mon fichier:
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
fichier après traitement :
2.2.2.2;toto.google.com
3.3.3.3;tata.google.com
fichier duplicate :
1.1.1.1;toto.google.com
1.1.1.1;tutu.google.com
Ce n'est donc pas qu'une simple suppression de doublon et je ne vois pas trop comment faire. Mon fichier fait environ 20 000 lignes.
Merci.
A voir également:
- [PERL]Comment supprimer des lignes en double dans un fichier ?
- Supprimer rond bleu whatsapp - Guide
- Double ecran - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier bin - Guide
2 réponses
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