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 :

Comparaison de deux listes


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut Comparaison de deux listes
    Bonjour à tous ,

    J'ai une première liste ressemblant à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Aats-phe
    Alas
    aralar1
    ATPsyn-beta
    ATPsyn-d
    ATPsyn-gamma
    blw
    CG10219
    CG10664
    Et une deuxième liste, un peu differente mais comprenant l'information de la premiere ressemblant à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Aats-phe-RA
    Alas-RA
    aralar1-RA
    ATPsyn-beta-RC
    ATPsyn-d.a
    ATPsyn-gamma-RD
    blw-RE
    CG10219-RF
    CG10664-RE
    Et je souhaite savoir si tous les elements de la premières listes sont dans la seconde, car, comme on peut le voir, chaque element de la première liste est contenu dans un element de la seconde.

    J'ai donc écris ce script, qui ne fonctionne pas :

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #!/usr/local/bin/perl
     
    use strict;
    use warnings;
    use Carp qw(confess);
    use Getopt::Long;
     
    use Bio::SeqIO;
     
    my $fasta_file;
    my $input;
     
    my @transcript;
    my @genes;
     
     
    GetOptions("fasta=s" => \$fasta_file ,"file=s" => \$input);
    my $in = Bio::SeqIO->new( -file => $fasta_file, '-format' => 'Fasta' );
    open(my $inp,'<',$input) or die "$input : $!\n\n";
     
    #deuxième liste dans mon exemple
    while ( my $seq = $in->next_seq()){
    	my $id = $seq->primary_id ;
    	push (@transcript,$id);
     
     
    }
     
    # première liste dans mon exemple
    while (my $ligne=<$inp>) {
        push @genes,$ligne;
    } 
     
     
    foreach my $g (@genes){
    	foreach my $t (@transcript){
     
    		if ($t =~ m/$g/){
    			print "transcript : $t genes : $g";
    		}
    	}
    }
    Quelqu'un pourrait m'aider ? Merci d'avance

  2. #2
    Membre averti
    Avatar de magicshark
    Homme Profil pro
    Dans une SS2I donc pas que JAVA
    Inscrit en
    Octobre 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dans une SS2I donc pas que JAVA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 133
    Points : 320
    Points
    320
    Par défaut
    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
    @ligneFic1 = <FIC1>;
    @ligneFic2 = <FIC2>;
    for(my $i=0;$i<@ligneFic1;$i++)
    {
        $trouve = 0;
        foreach $ligne2(@ligneFic2)
        {
            if()#recherche du motif
            {
             $trouve = 1;
            }
        }
        unless($trouve)
        {
         print $i+1."pas trouvé";
        }
    }
    désolé je suis assez précé j'ai pas tout mis
    Pourquoi faire simple quand on peut faire compliqué.

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Quelques conseils :
    - chomp les éléments chaque liste avant de les pusher
    - quotemeta($g) avant de l'utiliser dans une regexp
    - utilise un grep au lieu du deuxième foreach :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (grep /$g/, @transcript)
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  4. #4
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    Bonjour et merci pour votre aide,
    J'ai essayé ceci :

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #!/usr/local/bin/perl
     
    use strict;
    use warnings;
    use Carp qw(confess);
    use Getopt::Long;
     
    use Bio::SeqIO;
     
    my $fasta_file;
    my $input;
     
    my @transcript;
    my @genes;
     
     
    GetOptions("fasta=s" => \$fasta_file ,"file=s" => \$input);
    my $in = Bio::SeqIO->new( -file => $fasta_file, '-format' => 'Fasta' );
    open(my $inp,'<',$input) or die "$input : $!\n\n";
     
    # récupération des séquences et des identifiants
    while ( my $seq = $in->next_seq()){
    	my $id = $seq->primary_id ;
    	chomp $id;
    	push (@transcript,$id);
     
    }
     
    while (my $ligne=<$inp>) {
    	chomp $ligne;
    	push @genes,$ligne;
    } 
     
    #foreach my $t(@genes){
    #	print "$t\n";
    #}
     
     
    foreach my $g (@genes){
    	chomp $g;
     
    	if (grep(/$g/, @transcript)){
    		print "$g\n";
    	}
     
    }
    Mais cela ne me retourne rien alors que quand je fais un grep en ligne de commande, ca me retourne bien quelque chose ...
    quand je mets quotemeta($g) j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Useless use of quotemeta in void context at verif.pl line 40.

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    C'est que tu utilises mal quotemeta :

    Par ailleurs, le chomp($g) est utile (les éléments de @genes sont déjà chompé)
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  6. #6
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    j'ai modifié le quotemeta mais ca ne me retourne toujours rien, je ne vois vraiment pas d'où ca peut venir ....

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    #!/usr/local/bin/perl
     
    use strict;
    use warnings;
    use Carp qw(confess);
    use Getopt::Long;
     
    use Bio::SeqIO;
     
    my $fasta_file;
    my $input;
     
    my @transcript;
    my @genes;
     
     
    GetOptions("fasta=s" => \$fasta_file ,"file=s" => \$input);
    my $in = Bio::SeqIO->new( -file => $fasta_file, '-format' => 'Fasta' );
    open(my $inp,'<',$input) or die "$input : $!\n\n";
     
    # récupération des séquences et des identifiants
    while ( my $seq = $in->next_seq()){
    	my $id = $seq->primary_id ;
    	chomp $id;
    	push (@transcript,$id);
     
    }
     
    while (my $ligne=<$inp>) {
    	chomp $ligne;
    	push (@genes,$ligne);
    } 
     
    #foreach my $t(@genes){
    #	print "$t\n";
    #}
     
     
    foreach my $g (@genes){
    	$g = quotemeta($g);	
    	if (grep(/$g/, @transcript)){
    		print "$g\n";
    	}
     
    }

  7. #7
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Il y a peut-être des diversités minuscule/majuscule...
    essaye avec /$g/i
    Sinon, il nous faut voir les données de tes tableaux pour faire des essais.
    Après chacun des deux while, ajoute quelque chose comme çà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while ...
    open my $T, ">", "transcript.txt";
    say { $T } $_ foreach @transcript;
    ...
    while ...
    open my $G, ">", "genes.txt";
    say { $G } $_ foreach @genes;
    et renvoie au moins une partie des fichiers.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  8. #8
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    Je n'arrive pas à joindre les fichiers donc je les ai mit sur une page où vous pourrez les télécharger :

    le fichier avec les transcripts :
    http://filez.univmed.fr/download.php?ad=8377q0lG4c

    le fichier avec les genes :
    http://filez.univmed.fr/download.php?ad=83789cORxM

  9. #9
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    Le fait d'ajouter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while ...
    open my $T, ">", "transcript.txt";
    say { $T } $_ foreach @transcript;
    ...
    while ...
    open my $G, ">", "genes.txt";
    say { $G } $_ foreach @genes;
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    #!/usr/local/bin/perl
     
    use strict;
    use warnings;
    use Carp qw(confess);
    use Getopt::Long;
     
    use Bio::SeqIO;
     
    my $fasta_file;
    my $input;
     
    my @transcript;
    my @genes;
     
     
    GetOptions("fasta=s" => \$fasta_file ,"file=s" => \$input);
    my $in = Bio::SeqIO->new( -file => $fasta_file, '-format' => 'Fasta' );
    open(my $inp,'<',$input) or die "$input : $!\n\n";
     
    # récupération des séquences et des identifiants
    while ( my $seq = $in->next_seq()){
    	open my $T, ">", "transcript_98.fasta";
    	say { $T } $_ foreach @transcript;
    	my $id = $seq->primary_id ;
    	chomp $id;
    	push (@transcript,$id);
     
    }
     
    while (my $ligne=<$inp>) {
    	open my $G, ">", "liste_98.txt";
    	say { $G } $_ foreach @genes;
    	chomp $ligne;
    	push (@genes,$ligne);
    } 
     
    #foreach my $t(@transcript){
    #	print "$t\n";
    #}
     
     
    foreach my $g (@genes){
    	$g = quotemeta($g);	
    	if (grep(/$g/i, @transcript)){
    		print "$g\n";
    	}
     
    }
    Ne change rien ...

  10. #10
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Grrrrr....
    Il faut placer ces lignes APRES le while, pas DANS le while.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  11. #11
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    oups desolée :s
    Cette commande m'ecrit bien les genes et transcripts dans les fichiers ...

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #!/usr/local/bin/perl
     
    use strict;
    use warnings;
    use Carp qw(confess);
    use Getopt::Long;
     
    use Bio::SeqIO;
     
    my $fasta_file;
    my $input;
     
    my @transcript;
    my @genes;
     
     
    GetOptions("fasta=s" => \$fasta_file ,"file=s" => \$input);
    my $in = Bio::SeqIO->new( -file => $fasta_file, '-format' => 'Fasta' );
    open(my $inp,'<',$input) or die "$input : $!\n\n";
     
    # récupération des séquences et des identifiants
    while ( my $seq = $in->next_seq()){
    	my $id = $seq->primary_id ;
    	chomp $id;
    	push (@transcript,$id);
     
    }
     
    open my $T, ">", "transcript_98.fasta";
    say { $T } $_ foreach @transcript;
     
     
    while (my $ligne=<$inp>) {
    	chomp $ligne;
    	push (@genes,$ligne);
    } 
     
    open my $G, ">", "liste_98.txt";
    say { $G } $_ foreach @genes;
     
    #foreach my $t(@transcript){
    #	print "$t\n";
    #}
     
     
    foreach my $g (@genes){
    	$g = quotemeta($g);	
    	if (grep(/$g/i, @transcript)){
    		print "$g\n";
    	}
     
    }

  12. #12
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Oui, mais il fallait poster ces fichiers...
    Bon, là, je ne serai plus dispo avant lundi. A+
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  13. #13
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    Grace aux fichier que vous m'avez fait générés et en appliquant od -c à ces fichiers, j'ai pu identifier le problème qui vient en fait de "\r" après chaque gene dans le fichiers gene.txt ....
    J'ai donc ajouté avant le quotemeta ... et cela fonctionne !
    Merci beaucoup pour votre aide et bon week end

Discussions similaires

  1. [XL-2007] Comparaison de deux listes
    Par mcfly37 dans le forum Excel
    Réponses: 5
    Dernier message: 09/04/2015, 19h05
  2. [Débutant] Comparaison de deux listes
    Par chesrome dans le forum Windows Forms
    Réponses: 1
    Dernier message: 28/12/2012, 12h33
  3. comparaison de deux listes
    Par karaudrey88 dans le forum Langage
    Réponses: 4
    Dernier message: 18/12/2012, 14h04
  4. comparaison les éléments deux listes
    Par minooo dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 18/06/2012, 09h52
  5. Comparaison de deux listes de fichier
    Par jackiechen dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 07/01/2008, 16h28

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