Fusion de 2 tableaux avec Perl

Loulou -  
[Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je suis appelée à travailler avec de gros jeux de données... Je fais d'habitude toutes mes manipulations de données et analyses avec R, mais mes boucles n'en finissent plus sur mes tables...
Je me tourne donc vers la programmation perl pour essayer de régler mon problème, mais je suis complètement novice...

J'aimerais fusionner deux fichiers

fichier1 (reads)
nom1;sequence;etiquette
GX1;X23DF;SS1
GX2;X23DG;SS2
GX3;X23KG;SS1

fichier2 (contigs)
nom2;number;nom1
c1;1;GX15
c1;1;GX23
c2;2;GX10
(Il y a moins de lignes dans le fichier 2 que le fichier 1)

Je voudrais donc ajouter une "colonne" au fichier 2 contenant les valeurs de "etiquette" recherchées dans le fichier 1 (toutes les valeurs "étiquette" ne sont pas à reporter dans le fichier2, l'ordre est différent)
nom2;number;nom1;etiquette
c1;1;GX15;SS3
c1;1;GX23;SS5
c2;2;GX10;SS1

Auriez-vous une petite solution à mon petit problème?

Merci d'avance à tous

1 réponse

  1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    Salut Loulou,

    Tu peux faire cela en splittant les valeurs et en les stockant dans un hash.

    Si je comprends bien ton problème, tu cherches les valeurs de "etiquette" dans fichier1 par rapport à l'entrée de la colonne nom1. Ton exemple de données est donc incomplet pour obtenir le résultat que tu donnes en exemple, car il n'y a pas GX10, ni GX15, ni GX23 dans la colonne nom1 de fichier1.

    alors en supposant :

    $ cat fichier1 
    nom1;sequence;etiquette 
    GX1;X23DF;SS1 
    GX2;X23DG;SS2 
    GX3;X23KG;SS1 
    GX10;xxx;SS1 
    GX15;xxx;SS3 
    GX23;xxx;SS5 
    
    $ cat fichier2 
    nom2;number;nom1 
    c1;1;GX15 
    c1;1;GX23 
    c2;2;GX10 
    
    $ cat ajoutecolonne.pl 
    #!/usr/bin/perl -w 
    
    use strict; 
    
    my %Etiquette; 
    my @line_split; 
    
    open(FICH,"fichier1") || die ("Erreur d'ouverture de fichier1"); 
    
    while (<FICH>) 
    { 
      chomp; 
      @line_split = split(/;/); 
      if ($line_split[0] ne "nom1") 
      { 
        $Etiquette{$line_split[0]} = "$line_split[2]"; 
      } 
    } 
    close(FICH); 
    
    open(FICH,"fichier2") || die ("Erreur d'ouverture de fichier2"); 
    while (<FICH>) 
    { 
      chomp; 
      @line_split = split(/;/); 
      if ($line_split[0] ne "nom2") 
      { 
        print "$_;$Etiquette{$line_split[2]}\n"; 
      } 
    } 
    
    $ ./ajoutecolonne.pl 
    c1;1;GX15;SS3 
    c1;1;GX23;SS5 
    c2;2;GX10;SS1

    Dal
    0