[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
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.
A voir également:

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
Superbe.

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

Merci!
1
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
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 :

$ 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
-1