IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Problème avec grep


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 95
    Points : 27
    Points
    27
    Par défaut Problème avec grep
    Bonjour,

    J'ai un fichier1 ou il y'a :

    a[0] a
    b[0] b
    c[1] c

    et uun fichier2 ou il y'a :
    a[0] a
    b[0] b
    d[2] e

    je veux comparer ces deux fichiers, si chaque élement est dans l'autre, j'ai fait alors comme ceci ( ce qu'il ya de plus simple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
          open(A, "a.txt") or die("pb lecture fichier1 : $!\n");
          @a = <A>;
          chomp(@a);
          close(A);
     
          open(B, "b.txt") or die("pb lecture fichier2 : $!\n");
          @b = <B>;
          chomp(@b);
          close(B);
     
      foreach $k (@a) {
             if ( !( grep(/$k/, @b) ) ) {
              print "erreur pour $k\n";
      	}
        else {
        print "not erreur pr $k\n";
        }
          }
    Et ça me donne tout faux, je ne comprends pas d'ou lerreur ...Voulez vous bien m'aider, merci d'avance.

  2. #2
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    si tu veux comparer 2 listes (ce que ton code fait en fin de compte), pourquoi ne pas utiliser le module List::Compare ?

    ce bout de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    use Data::Dumper;
    use List::Compare;
     
    open(A, "a.txt") or die("pb lecture fichier1 : $!\n");
    my @a = <A>;
    chomp(@a);
    close(A);
     
    open(B, "b.txt") or die("pb lecture fichier2 : $!\n");
    my @b = <B>;
    chomp(@b);
    close(B);
     
     
    my $lc = List::Compare->new('-u', \@a, \@b);
    my @common = $lc->get_intersection();
    my @a_only = $lc->get_Lonly();
    my @b_only = $lc->get_Ronly();
     
    print "common\n";
    print Dumper @common;
    print "a only\n";
    print Dumper @a_only;
    print "b only\n";
    print Dumper @b_only;
    te donnera

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    common
    $VAR1 = 'a[0] a';
    $VAR2 = 'b[0] b';
    a only
    $VAR1 = 'c[1] c';
    b only
    $VAR1 = 'd[2] e';
    sinon pour le grep le problème vient des [], $k est lu comme une expression régulière et les crochets sont des caractères spéciaux.

    tu peux corriger ça en les échappant, comme cela par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    foreach my $k (@a) {
    	$k =~ s/\[/\\[/;
    	$k =~ s/\]/\\]/;
    	if ( ! grep /$k/, @b ) {
    		print "erreur pour $k\n";
    	}
    	else {
    		print "not erreur pr $k\n";
    	}
    }

  3. #3
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par Gardyen Voir le message
    sinon pour le grep le problème vient des [], $k est lu comme une expression régulière et les crochets sont des caractères spéciaux.

    tu peux corriger ça en les échappant, comme cela par exemple
    Il est préférable d'utiliser quotemeta() : on risque d'oublier certains caractères spéciaux sinon :
    --
    Jedaï

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 95
    Points : 27
    Points
    27
    Par défaut
    Merci pour l'aide...Mais j'ai encore un autre problème, quand j'utilise ce bout de code sur de gros fichiers, ça ne marche plus...Est ce logique que cette méthode marche que dans un seul sens. Quand j'echange l'ordre des fichiers ça ne marche pas..ça serait du à quoi?

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 95
    Points : 27
    Points
    27
    Par défaut
    A part le retour chariot quels sont les éléments qui peuvent différencier entre deux lignes et pas visibles.

    Dans deux dichiers j'ai la même ligne, qd je chercher la ligne de fic1 dans fic 2 je la trouve, et qd je cherche la même ligne de fic2 dans fic 1 je ne la trouve pas. A oeil nu, ben j'ai 'toto' dans fic1 et 'toto' dans fic2...ça peut etre duc à quoi.

    Merccccccccii,

    ben je ne sais pas ce quit peut cause ceci...Je suis plantée depuis...

  6. #6
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Il peut y avoir des espaces en plus au début et à la fin (surtout à la fin) des lignes. Si tu as des doutes, essaie de normaliser tes lignes au maximum (supprime les espaces au début et à la fin, met tout en minuscules, etc...).

    --
    Jedaï

  7. #7
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    si j'ai bien compris tu prends le même bout de code (celui avec List::Compare ? ou ton original ?) et si tu inverses juste le nom de 2 fichiers ça ne marche plus ?

    habituellement on rencontre ce genre de problèmes quand on passe des fichiers de windows vers linux (le \r de windows n'est pas retire), est ce que ça s'applique a ton cas ?

  8. #8
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 95
    Points : 27
    Points
    27
    Par défaut
    j'utilise mon code pas le tien. Biensur en prenant en consideration ta remarque des expressions régulieres.

    ça marche en fait que d'un côté.

    Pour Jedai, veux tu bien me proposer une expression qui supprime les espaces au debut et a la fin ( je suis nulle en regex).

    En fait il y'a des majuscules et des minuscules, mais je en crois pas que c'est la cause car deja le bout de code marche d'un cote.


  9. #9
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 95
    Points : 27
    Points
    27
    Par défaut
    Comme t'as dit Jedai, pour eliminer les espaces supplémentaires ( je veux dire plus qu'un espace), je dois ajouter : s/ +//g;

    Mais ça marche tjrs pas, j'ai fait chomp, j'ai fait la supprression des espaces inutils sur tte la ligne...

    Là je ne sais pas ce qui m'echappe. Svp si quelqu'un a une idée!!!

  10. #10
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    En fait, avec ton grep tu testes, pour chaque ligne de @a, si les lignes de @b la contienne, pas si elles sont égales. C'est donc normal que ce ne soit pas symétrique. (contenir le motif est une relation antisymétrique).

    Change simplement ton test. Par exemple, grep(/^$k$/, @b).

    Tu peux aussi utiliser grep { ($_ eq $k) } @b. Perso, je trouve cette dernière option plus lisible.

    D'ailleurs tu peux même écrire map { ($_ eq $k) } @b puisque tu n'utilises la valeur de sortie que pour un test.

    (J'espère que je ne divague pas car c'est l'heure de l'apéro, là et bon... )

Discussions similaires

  1. Problème avec "grep -w"
    Par cantoprod dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 11/10/2011, 13h35
  2. problème avec grep -v
    Par medsup dans le forum Linux
    Réponses: 5
    Dernier message: 17/06/2011, 17h00
  3. Problème avec grep
    Par oumokhtar dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 25/01/2009, 15h55
  4. Problème avec grep et regexp
    Par redvivi dans le forum Linux
    Réponses: 10
    Dernier message: 16/08/2008, 16h41
  5. Problème avec grep sous Cygwin
    Par tnarol dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 09/07/2008, 17h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo