[PERL]Comment supprimer des lignes en double dans un fichier ? [Résolu/Fermé]

Messages postés
1053
Date d'inscription
mardi 20 octobre 2009
Statut
Membre
Dernière intervention
2 avril 2015
- - Dernière réponse : fxtaa
Messages postés
1053
Date d'inscription
mardi 20 octobre 2009
Statut
Membre
Dernière intervention
2 avril 2015
- 11 déc. 2013 à 17:13
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.
Afficher la suite 

2 réponses

Messages postés
1053
Date d'inscription
mardi 20 octobre 2009
Statut
Membre
Dernière intervention
2 avril 2015
53
0
Merci
Superbe.

j'avais fait une boucle dans une boucle... c'était pas super opti.

Merci!
Messages postés
5251
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
17 octobre 2019
806
-1
Merci
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 :

$ 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