Fusionner des fichiers entre eux : la commande join

Lan­gage : shell
Com­mande pré­sen­tée : join
Niveau : débu­tant

Présentation de la commande join

La com­mande join est dis­po­nible nati­ve­ment sur les sys­tèmes d'exploitation GNU/​Linux. Il s'agit d'une com­mande POSIX et elle est donc pré­sente sur tous les sys­tèmes d'exploitation UNIX et UNIX-Like. La plu­part des gens uti­lisent cette com­mande pour récu­pé­rer les lignes com­munes entre deux fichiers mais elle ne se limite pas à ce seul cas.
Join vous per­met de fusion­ner des champs (colonnes) pré­cis de deux fichiers textes et d'en récu­pé­rer la liste des don­nées com­munes ou encore de vous affi­cher un résul­tat proche de ce que vous pour­riez faire en SQL avec une requête JOIN.
Dans ce billet je vais vous mon­trer dif­fé­rentes façons dont on pour­rait se ser­vir de cette com­mande pour récu­pé­rer de l'information bio­lo­gique à par­tir de don­nées tex­tuelles.

Exemple de résultat de la commande join | Auteur : Norore. Image libre de droit.
Exemple de résul­tat de la com­mande join | Auteur : Norore. Image libre de droit.

Préparation des fichiers

Nous nous pro­po­sons de trou­ver les iden­ti­fiants Uni­Prot des gènes d'Esche­ri­chia coli iden­ti­fiés par le NCBI pour le cycle de Krebs. Pour cela il faut récu­pé­rer des don­nées dans dif­fé­rentes banques de don­nées.
Récu­pé­ra­tion des don­nées sur les gènes d'Esche­ri­chia coli :

Récu­pé­ra­tion des don­nées Uni­Prot d'Escherichia coli :

Liste des gènes du cycle de Krebs : (fichier : genes_cycle_krebs_ecoli.txt, source KEGG)
Ces fichiers pré­sentent des don­nées sous forme de colonnes.

Colonnes du fichier du NCBI :

  1. Numé­ro de taxon
  2. Iden­ti­fiant du gène (GeneID)
  3. Sym­bole du gène
  4. Loca­li­sa­tion du gène
  5. Syno­nymes
  6. Réfé­rences croi­sées
  7. Chro­mo­some
  8. Loca­li­sa­tion sur la carte chro­mo­so­mique
  9. Des­crip­tion
  10. Type de gène
  11. Sym­bole pro­ve­nant de l'autorité de nomen­cla­ture
  12. Nom com­plet four­ni par l'autorité de nomen­cla­ture
  13. Sta­tut de la nomen­cla­ture
  14. Autres dési­gna­tions
  15. Date de modi­fi­ca­tion

Colonnes du fichier d'UniProt :

  1. Numé­ro d'accession Uni­Prot
  2. Base de don­nées d'origine
  3. Iden­ti­fiant de la base de don­nées d'origine

Dans un pre­mier temps, nous allons extraire les infor­ma­tions sur les gènes à l'aide de la com­mande grep, comme décrite dans ce billet du blog :

Main­te­nant que les fichiers sont pré­pa­rés, nous allons pou­voir faire deux exer­cices :

  • une fusion simple des fichiers ;
  • une fusion des fichiers avec sélec­tion des colonnes d'intérêt.

Fusion simple

Avant de fusion­ner les fichiers, vous devez vous assu­rer qu'ils sont triés de la même façon sur les colonnes à fusion­ner. Par défaut la com­mande join fusionne sur la pre­mière colonne mais il est pos­sible de pré­ci­ser les colonnes pour chaque fichier.
Voi­ci un exemple simple pour illus­trer dans un pre­mier temps la com­mande join :

La com­mande join va affi­cher sur chaque ligne le #ID, le Pré­nom et la Console pour chaque indi­vi­du (les tabu­la­tions sont rem­pla­cées par des espaces, c'est le com­por­te­ment par défaut de la com­mande) :

Dans nos exemples bio­lo­giques, nous tra­vaille­rons sur les iden­ti­fiants GeneID des deux fichiers, soit la colonne 3 pour le fichier d'UniProt (option -1 3) et la colonne 2 pour le fichier du NCBI (option -2 2). De plus, nous avons besoin de trou­ver les don­nées qui cor­res­pondent au NCBI dans le fichier d'UniProt. Dans un pre­mier temps nous devons trier les colonnes de la même façon pour cha­cun des fichiers :

La fusion simple se fait ain­si :

Décor­ti­quons les options spé­ci­fiées à la com­mande join :

  • -13 : fichier 1 (ECOLI_83333_idmapping2.dat), colonne 3
  • -22 : fichier 2 (geneinfo_krebs_ecoli2.tsv), colonne 2

Les erreurs sou­le­vées (join : ECOLI_83333_idmapping2.dat:4209 : n'est pas trié) sont dues au fait que, dans le fichier Uni­Prot, un même iden­ti­fiant de gène peut être asso­cié à plu­sieurs iden­ti­fiants Uni­Prot –dois-je vous rap­pe­ler qu'un gène peut coder pour plus d'une pro­téine ?
Dans le résul­tat affi­ché, la pre­mière colonne cor­res­pond à la colonne com­mune aux deux fichiers, les colonnes 2 et 3 cor­res­pondent aux colonnes 1 et 2 du fichier Uni­Prot, les autres colonnes cor­res­pondent aux colonnes du fichier du NCBI, avec la colonne 2 en moins (elle est fusion­née dans la colonne 1 du résul­tat).

Fusionner les fichiers et n'afficher que certaines colonnes

Comme vous pou­vez le consta­ter, il y a beau­coup de colonnes, ce qui peut être lourd à trai­ter par la suite. On va donc n'afficher que cer­taines colonnes afin de faci­li­ter d'autres éven­tuelles mani­pu­la­tions sur ces don­nées.

En repre­nant notre exemple sim­pliste, voi­ci ce que nous pour­rions faire avec les fichiers :

Ici nous ne vou­lons affi­cher que les pré­noms et le construc­teur de chaque console uti­li­sée pour chaque per­sonne en pos­sé­dant une, nous allons donc affi­cher la colonne 2 du fichier 1 et la colonne 3 du fichier 2 (option -o). De plus, comme la console Nin­ten­do DS contient un espace dans son nom, nous devons pré­ci­ser à la com­mande join d'utiliser le sépa­ra­teur tabu­la­tion (option -t) :

Dans notre exemple avec les don­nées bio­lo­giques, nous allons sélec­tion­ner, pour le fichier du NCBI, les colonnes sui­vantes :

  • GeneID, colonne 2
  • Sym­bole, colonne 3
  • Syno­nyms, colonne 4
  • Des­crip­tion, colonne 9
  • Type de gène, colonne 10

Pour le fichier Uni­Prot, nous allons sélec­tion­ner la colonne 1 qui cor­res­pond à l'identifiant Uni­Prot.
En repre­nant la pre­mière com­mande et en pré­ci­sant les colonnes d'intérêt, voi­ci la nou­velle com­mande à uti­li­ser et son résul­tat :

Expli­ca­tion sur les options uti­li­sées :

  • -o : pré­cise la liste des colonnes à affi­cher. Le pre­mier chiffre doit être le numé­ro du fichier et le second le numé­ro de la colonne à affi­cher.
  • -t $'\t' : pré­cise à la com­mande join que les champs sont sépa­rés par des tabu­la­tions, néces­saire dans ce cas de figure.

Quand join se prend pour SQL

Vous l'aurez remar­qué, la com­mande de base de join fusionne les fichiers entre eux en n'affichant que les lignes com­munes. Or dans cer­tains cas vous aime­riez pou­voir conser­ver les lignes d'un de vos fichiers, afin de voir quelles sont les lignes qui n'ont pas pu être fusion­nées. Pour cela, vous pou­vez uti­li­ser l'option -a sui­vie du numé­ro du fichier pour lequel vous vou­lez affi­cher les lignes.
Vous avez pris peu de colonnes et vous avez peur de pas­ser à côté d'une ligne non fusion­née ? Uti­li­sez l'option -e sui­vie, entre guille­mets, d'un mot clé, comme NULL par exemple. Ain­si vous sau­rez que toutes les lignes qui ont ce mot clé n'ont pas pu être fusion­nées.

En voi­ci une illus­tra­tion avec nos joueurs de consoles pré­fé­rés, ici nous deman­dons à join d'afficher toutes les lignes de fichier1.txt et d'ajouter le mot clé "Aucun" lorsque la ligne n'est pas fusion­née avec fichier2.txt :

 

Conclusion

La com­mande join est une com­mande qui effraye cer­tains d'entre nous, or une fois que l'on connaît et que l'on a com­pris son fonc­tion­ne­ment, il est vrai­ment pos­sible de s'amuser avec. Ne faites pas la même erreur que moi dans ces exemples, encore que l'erreur a pu vous illus­trer les limites de la com­mande : assu­rez-vous que la colonne que vous cher­chez à fusion­ner n'aura qu'une seule occur­rence pour chaque clé ! Dans mon exemple, si je veux retrou­ver les infor­ma­tions pour les iden­ti­fiants Uni­Prot des lignes qui ont géné­ré des erreurs, je vais devoir pas­ser par la com­mande grep.
J'espère que ce billet aura per­mis aux plus fri­leux d'entre vous d'entrevoir les pos­si­bi­li­tés offertes par cette com­mande qui mérite que l'on s'y inté­resse dans notre domaine.

Pour com­prendre un peu mieux les exemples que je vous ai mon­tré, vous pou­vez consul­ter cette page et vous en ins­pi­rer, elle m'a for­te­ment aidée dans mes débuts avec cette com­mande : http://​fr​.wiki​pe​dia​.org/​w​i​k​i​/​J​o​i​n​_​(​U​nix)


Mer­ci à Bun­ny, nal­lias, Clem_​ et ZaZo0o pour leur relec­ture et nos échanges.



Pour continuer la lecture :


Commentaires

Une réponse à “Fusionner des fichiers entre eux : la commande join”

  1. Très bon article, je pense que ça va être assez utile.
    Une petite blague au pas­sage : http://​dans​ton​chat​.com/​1​4​6​3​6​.​h​tml
    ;-D

Laisser un commentaire