Manipuler des fichiers¶

Equipe pédagogique : P. François, M. Genete, C. Toffano-Nioche, E. Jacquemet, G. Le Corguillé, J. Seiler, D. Puthier, T. Denecker et tout le staff¶

Format de fichier¶

Avant toutes choses, parlons d'un format de fichier, le bed.

Au cours de cette semaine, vous aurez l'occasion de rencontrer un grand nombre de formats différents. Voici quelques informations sur celui qui nous intéresse ici :

  1. Il contient des annotations avec leurs coordonnées (début/fin) génétiques.
  2. Les coordonnées sont toujours données par rapport au brin +. C'est la colonne "sens" qui vous indique si votre annotation est sur le brin direct (+) ou reverse (-).
  3. Son nom signifie Browser Extensible Format
  4. Il peut être au format BED6 ou BED12 (pour les plus courants). Le BED6 contient 6 colonnes et le BED12... 12 !
  5. Les coordonées sont dites en "zero-based, half-open" [0,n) en opposition à l'"intervalle clos" [1,n]

Par exemple :

chr1 100 200 peak_1 123 +

Il faut lire que :

  • sur le chromosome "chr1",
  • entre les positions [100,200),
  • se trouve l'élément génétique nommé "peak_1".
  • Il a un score de 123 et est porté par le brin sens (+)

Ceci est le stric minimum à comprendre pour notre TP. Si vous souhaitez plus d'informations sur ce format, vous pouvez consulter ce lien.

Télécharger un fichier¶

Afin de pouvoir manipuler des fichiers, nous allons télécharger un fichier BED.

Il est possible d'utiliser la commande wget pour récupérer un fichier à partir d'un lien.

Votre mission si vous l'acceptez :

  1. Rendez-vous dans le dossier chip-seq que nous avons créé précédemment.
  2. Créez un dossier bed.
  3. Déplacez vous dans ce dossier bed.
  4. Télécharger le fichier à l'adresse suivante : https://zenodo.org/record/5716151/files/hg38_exons.bed.gz
In [1]:
# Se rendre dans le répertoire chip-seq
cd chip-seq/
In [2]:
# Créer le dossier bed
mkdir bed
# Se rendre dans le dossier bed
cd bed
In [3]:
# Télécharger le fichier
wget https://zenodo.org/record/5716151/files/hg38_exons.bed.gz
--2024-11-13 21:23:06--  https://zenodo.org/record/5716151/files/hg38_exons.bed.gz
Resolving zenodo.org (zenodo.org)... 188.185.79.172, 188.184.98.238, 188.184.103.159, ...
Connecting to zenodo.org (zenodo.org)|188.185.79.172|:443... connected.
HTTP request sent, awaiting response... 301 MOVED PERMANENTLY
Location: /records/5716151/files/hg38_exons.bed.gz [following]
--2024-11-13 21:23:06--  https://zenodo.org/records/5716151/files/hg38_exons.bed.gz
Reusing existing connection to zenodo.org:443.
HTTP request sent, awaiting response... 200 OK
Length: 8838009 (8.4M) [application/octet-stream]
Saving to: ‘hg38_exons.bed.gz’

hg38_exons.bed.gz   100%[===================>]   8.43M  40.3MB/s    in 0.2s    

2024-11-13 21:23:07 (40.3 MB/s) - ‘hg38_exons.bed.gz’ saved [8838009/8838009]

Décompresser un fichier¶

Pour connaître le type de fichier, il est possible d'utiliser la commande file.

Utilisation : file votre_fichier.

Quel est le type du fichier que nous venons de télécharger ?

In [4]:
# Afficher le type du fichier hg38_exons.bed.gz
file hg38_exons.bed.gz
hg38_exons.bed.gz: gzip compressed data, was "hg38_exons.bed", last modified: Tue Nov 20 10:29:21 2018, from Unix, original size modulo 2^32 84636376

Il semble donc qu'il soit compressé.

Afin de le décompresser, il existe l'outil gunzip (à condition qu'il ait été compressé par l'outil gzip)

L'usage est classique : gunzip fichier.gz.

N.B. : Un fichier compressé est beaucoup plus petit qu'un fichier non compressé. D'où leur nom. Rare sont les fichiers zippés par plaisir. Avant de les décompresser, assurez vous que cela soit nécessaire. Beaucoup d'outils acceptent les fichiers compressés en entrée.¶

Pour celui-ci, pas de souci à le décompresser, alors essayons.

In [5]:
# Décompression du fichier hg38_exons.bed.gz
gunzip hg38_exons.bed.gz

Affichez le contenu du dossier pour voir ce qu'est devenu notre fichier

In [6]:
# Listing du dossier
ls -l
total 65604
-rw-rw----+ 1 pfrancois pfrancois 84636376 Nov 13 21:23 hg38_exons.bed

On voit que le fichier a perdu son extension .gz.

Vérifions maintenant son type à nouveau.

In [7]:
# Type du fichier
file hg38_exons.bed
hg38_exons.bed: ASCII text

Il n'est plus compressé et correspond à un fichier texte.

Visualiser un fichier¶

Nous voudrions visualiser notre fichier fraichement chargé pour comprendre ce qu'il contient.

Voici d'abord trois commandes utiles et utilisables dans ce jupyter notebook :

  • head : Affiche les 10 premières lignes du fichier.
  • tail : Affiche les 10 dernières lignes du fichier.

--> Tous deux viennent avec l'option très utile -n qui vous permet de spécifier le nombre de lignes souhaitées s'il est différent de 10.

  • cat : Affiche l'ensemble du fichier. Utilisez le si vous êtes sûrs de ne pas avoir trop de ligne à afficher...

Essayez d'afficher les 10 premières lignes de notre fichier.

In [8]:
# Affiche les 10 premières lignes du fichier
head hg38_exons.bed
chr1	100000636	100000739	RNU6-1318P|ENST00000365389|snRNA	.	-
chr1	100007033	100007156	AC118553.2|ENST00000638792|protein_coding	.	+
chr1	100007033	100007156	AC118553.2|ENST00000638968|nonsense_mediated_decay	.	+
chr1	100007033	100007156	AC118553.2|ENST00000639037|protein_coding	.	+
chr1	100007033	100007156	AC118553.2|ENST00000639040|nonsense_mediated_decay	.	+
chr1	100007033	100007156	AC118553.2|ENST00000639171|nonsense_mediated_decay	.	+
chr1	100007033	100007156	AC118553.2|ENST00000640238|nonsense_mediated_decay	.	+
chr1	100007033	100007156	AC118553.2|ENST00000640357|nonsense_mediated_decay	.	+
chr1	100007033	100007156	SLC35A3|ENST00000370153|protein_coding	.	+
chr1	100007033	100007156	SLC35A3|ENST00000370155|nonsense_mediated_decay	.	+

Maintenant affichez en les 10 dernières lignes.

In [9]:
# Affiche les 10 dernières lignes du fichier
tail hg38_exons.bed
chrY	9907662	9908139	TSPY13P|ENST00000338964|unprocessed_pseudogene	.	-
chrY	9910797	9910854	TTTY23|ENST00000452889|lincRNA	.	+
chrY	9910967	9911113	TTTY23|ENST00000452889|lincRNA	.	+
chrY	9911653	9911962	TTTY23|ENST00000452889|lincRNA	.	+
chrY	9951552	9951661	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chrY	9952122	9952198	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chrY	9957439	9957552	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chrY	9958418	9958529	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chrY	9958609	9958698	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chrY	9959111	9959423	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+

Ici nous ne pouvons pas tester la commande cat car notre fichier est trop volumineux !

Pour la suite des exemples, nous utiliserons le fichier 05_short.bed qui se trouve deux crans plus haut.

Copiez le dans votre dossier courant.

In [10]:
# Copier le fichier 05_short.bed qui se trouve deux crans en arrière
cp ../../05_short.bed .

Cette fois, essayons la commande cat

In [11]:
# Afficher tout le fichier
cat 05_short.bed
chr1	100007033	100007156	AC118553.2|ENST00000638792|protein_coding	.	+
chr1	100007033	100007156	AC118553.2|ENST00000638968|nonsense_mediated_decay	.	+
chr1	100007033	100007156	AC118553.2|ENST00000639037|protein_coding	.	+
chr1	100007033	100007156	AC118553.2|ENST00000639040|nonsense_mediated_decay	.	+
chr1	100007033	100007156	AC118553.2|ENST00000639171|nonsense_mediated_decay	.	+
chr1	100007033	100007156	AC118553.2|ENST00000640238|nonsense_mediated_decay	.	+
chr1	100007033	100007156	AC118553.2|ENST00000640357|nonsense_mediated_decay	.	+
chrY	9907662	9908139	TSPY13P|ENST00000338964|unprocessed_pseudogene	.	-
chr1	100007033	100007156	SLC35A3|ENST00000370153|protein_coding	.	+
chr1	100007033	100007156	SLC35A3|ENST00000370155|nonsense_mediated_decay	.	+
chrY	9951552	9951661	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chrY	9952122	9952198	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chrY	9957439	9957552	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chrY	9958418	9958529	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chrY	9958609	9958698	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chrY	9959111	9959423	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chrY	9910797	9910854	TTTY23|ENST00000452889|lincRNA	.	+
chrY	9910967	9911113	TTTY23|ENST00000452889|lincRNA	.	+
chr1	100000636	100000739	RNU6-1318P|ENST00000365389|snRNA	.	-
chr1	100000636	100000739	RNU6-1318P|ENST00000365389|snRNA	.	-

Nous pouvons maintenant dire que notre fichier contient les exons de divers gènes. Plusieurs lignes ayant le même nom d'annotation, cela signifie qu'on a une ligne par exon et plusieurs exons par gène.

Deux autres commandes peuvent être utilisées pour regarder les fichiers mais uniquement dans le terminal :

  • more : Permet de parcourir un fichier. Une fois que vous le quittez, toutes les lignes restent affichées.
  • less : Permet de parcourir un fichier. Une fois que vous le quittez, toutes les lignes disparaissent.

L'une comme l'autre pourront vous rendre la main en appuyant sur la touche q.

Nous avons deux citations de grands hommes qui ont tenté de nous faire un résumé de la différence entre less et more, nous vous laissons juge.

  • Less does more or less the same as more, but rather more than less, I like less more than more (Jacques van Helden)
  • Un avantage de less est qu’on peut remonter en arrière; avec more … c’est mort (Marc Deloger)

Compter les lignes d'un fichier¶

Parmi les petites commandes bien utiles au quotidien, nous retrouvons la commande wc qui, par défaut, permet de compter le nombre de lignes, de mots et d'octets contenus dans un fichier.

Si on ne souhaite pas afficher toutes ces informations, on peut utiliser les options :

  • -l : pour afficher le nombre de lignes
  • -w : pour afficher le nombre de mots
  • -c : pour afficher le nombre d'octets

Combien nos fichiers hg38_exons.bed et 05_short.bed contiennent-ils de lignes ? Pour notre fichier complet, si nous reformulons cette question, sachant que chaque ligne contient un exon : Combien d'exons contient notre génome hg38 ?

In [12]:
# Compter le nombre de lignes
wc -l hg38_exons.bed 05_short.bed
 1261870 hg38_exons.bed
      20 05_short.bed
 1261890 total

Extraire une colonne¶

Admettons qu'un fichier contiennent trop d'informations et que nous sachions que seules quelques colonnes nous suffiraient, la commande cut sera particulièrement utile.

cut prend nécessairement une option pour savoir quoi couper.

Celle que vous verrez le plus souvent utilisée est -f qui permet de couper des colonnes (fields)

Il vous suffira ensuite de spécifier le numéro de la colonne que vous souhaitez couper.

Subtilité des numéros de colonne :

  • -f 1 : coupe la colonne 1
  • -f 1,3 : coupe les colonnes 1 ET 3
  • -f 1-3 : coupe les colonnes 1 À 3
  • -f 3- : coupe les colonnes 3 jusqu'à la fin (Ici 3, 4, 5 et 6)
  • -f -3 : coupe les colonnes depuis le début jusqu'à 3 (Donc 1, 2 et 3)

Attention, cut conserve l'ordre d'origine des colonnes, que vous écriviez -f 2,3 ou -f 3,2, ne changera donc rien.

Essayez de sortir la première colonne du fichier 05_short.bed puis les colonnes à partir de la colonne 4 du même fichier.

In [13]:
# On extrait la colonne 1
cut -f1 05_short.bed
# On ajoute un echo qui affiche quelques pointillés pour séparer visuellement nos deux sorties
echo "-------"
# Puis les colonnes à partir de la 4
cut -f4- 05_short.bed
chr1
chr1
chr1
chr1
chr1
chr1
chr1
chrY
chr1
chr1
chrY
chrY
chrY
chrY
chrY
chrY
chrY
chrY
chr1
chr1
-------
AC118553.2|ENST00000638792|protein_coding	.	+
AC118553.2|ENST00000638968|nonsense_mediated_decay	.	+
AC118553.2|ENST00000639037|protein_coding	.	+
AC118553.2|ENST00000639040|nonsense_mediated_decay	.	+
AC118553.2|ENST00000639171|nonsense_mediated_decay	.	+
AC118553.2|ENST00000640238|nonsense_mediated_decay	.	+
AC118553.2|ENST00000640357|nonsense_mediated_decay	.	+
TSPY13P|ENST00000338964|unprocessed_pseudogene	.	-
SLC35A3|ENST00000370153|protein_coding	.	+
SLC35A3|ENST00000370155|nonsense_mediated_decay	.	+
RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
TTTY23|ENST00000452889|lincRNA	.	+
TTTY23|ENST00000452889|lincRNA	.	+
RNU6-1318P|ENST00000365389|snRNA	.	-
RNU6-1318P|ENST00000365389|snRNA	.	-

Trier un fichier¶

Autre commande pratique : sort qui permet de trier votre fichier.

Par défaut, le fichier sera trié selon la première colonne par ordre alphabétique.

Si nous préférons une autre colonne ou un autre ordre, comme toujours, des options existent !

  • -k : Permet d'indiquer la colonne de tri. Attention de bien l'écrire, par exemple pour trier sur la colonne 2, il faudra écrire -k 2,2. De la sorte on indique que le tri se fait de la colonne 2 à la colonne 2.
  • -k 2,2nr : Permet de trier la colonne 2 par ordre numérique (entiers) et en ordre inverse (reverse)
  • -k 2,2g : Permet de trier la colonne 2 par valeurs numériques décimales. (Le g vient du nom complet de cette option : --general-numeric-sort)

Triez le fichier 05_short.bed selon l'ordre alphabétique de la colonne contenant les annotations (colonne 4)

In [14]:
# Tri selon la colonne 4
sort -k4,4 05_short.bed
chr1	100007033	100007156	AC118553.2|ENST00000638792|protein_coding	.	+
chr1	100007033	100007156	AC118553.2|ENST00000638968|nonsense_mediated_decay	.	+
chr1	100007033	100007156	AC118553.2|ENST00000639037|protein_coding	.	+
chr1	100007033	100007156	AC118553.2|ENST00000639040|nonsense_mediated_decay	.	+
chr1	100007033	100007156	AC118553.2|ENST00000639171|nonsense_mediated_decay	.	+
chr1	100007033	100007156	AC118553.2|ENST00000640238|nonsense_mediated_decay	.	+
chr1	100007033	100007156	AC118553.2|ENST00000640357|nonsense_mediated_decay	.	+
chrY	9951552	9951661	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chrY	9952122	9952198	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chrY	9957439	9957552	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chrY	9958418	9958529	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chrY	9958609	9958698	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chrY	9959111	9959423	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chr1	100000636	100000739	RNU6-1318P|ENST00000365389|snRNA	.	-
chr1	100000636	100000739	RNU6-1318P|ENST00000365389|snRNA	.	-
chr1	100007033	100007156	SLC35A3|ENST00000370153|protein_coding	.	+
chr1	100007033	100007156	SLC35A3|ENST00000370155|nonsense_mediated_decay	.	+
chrY	9907662	9908139	TSPY13P|ENST00000338964|unprocessed_pseudogene	.	-
chrY	9910797	9910854	TTTY23|ENST00000452889|lincRNA	.	+
chrY	9910967	9911113	TTTY23|ENST00000452889|lincRNA	.	+

Triez le même fichier mais en respectant l'ordre génétique, donc d'abord en tri alphabétique de la colonne 1 puis l'ordre numérique de la colonne 2.

In [15]:
# Tri selon les colonnes 1 et 2 (2 en ordre numérique)
sort -k1,1 -k2,2n 05_short.bed
chr1	100000636	100000739	RNU6-1318P|ENST00000365389|snRNA	.	-
chr1	100000636	100000739	RNU6-1318P|ENST00000365389|snRNA	.	-
chr1	100007033	100007156	AC118553.2|ENST00000638792|protein_coding	.	+
chr1	100007033	100007156	AC118553.2|ENST00000638968|nonsense_mediated_decay	.	+
chr1	100007033	100007156	AC118553.2|ENST00000639037|protein_coding	.	+
chr1	100007033	100007156	AC118553.2|ENST00000639040|nonsense_mediated_decay	.	+
chr1	100007033	100007156	AC118553.2|ENST00000639171|nonsense_mediated_decay	.	+
chr1	100007033	100007156	AC118553.2|ENST00000640238|nonsense_mediated_decay	.	+
chr1	100007033	100007156	AC118553.2|ENST00000640357|nonsense_mediated_decay	.	+
chr1	100007033	100007156	SLC35A3|ENST00000370153|protein_coding	.	+
chr1	100007033	100007156	SLC35A3|ENST00000370155|nonsense_mediated_decay	.	+
chrY	9907662	9908139	TSPY13P|ENST00000338964|unprocessed_pseudogene	.	-
chrY	9910797	9910854	TTTY23|ENST00000452889|lincRNA	.	+
chrY	9910967	9911113	TTTY23|ENST00000452889|lincRNA	.	+
chrY	9951552	9951661	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chrY	9952122	9952198	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chrY	9957439	9957552	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chrY	9958418	9958529	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chrY	9958609	9958698	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chrY	9959111	9959423	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+

Retirer des doublons d'un fichier¶

Il arrive que plusieurs lignes parfaitement identiques existent dans un fichier.

La commande uniq permet d'éliminer cette redondance.

Attention¶

Si deux lignes identiques existent mais ne se suivent pas, uniq ne les enlevera pas !

Affichez les 5 dernières lignes du fichier 05_short.bed pour bien noter la redondance.

In [16]:
# Affiche les 5 premières lignes du fichier
tail -n5 05_short.bed
chrY	9959111	9959423	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chrY	9910797	9910854	TTTY23|ENST00000452889|lincRNA	.	+
chrY	9910967	9911113	TTTY23|ENST00000452889|lincRNA	.	+
chr1	100000636	100000739	RNU6-1318P|ENST00000365389|snRNA	.	-
chr1	100000636	100000739	RNU6-1318P|ENST00000365389|snRNA	.	-

Utilisez la commande uniq pour éliminer cette redondance.

In [17]:
# Afficher les lignes de façon unique
uniq 05_short.bed
chr1	100007033	100007156	AC118553.2|ENST00000638792|protein_coding	.	+
chr1	100007033	100007156	AC118553.2|ENST00000638968|nonsense_mediated_decay	.	+
chr1	100007033	100007156	AC118553.2|ENST00000639037|protein_coding	.	+
chr1	100007033	100007156	AC118553.2|ENST00000639040|nonsense_mediated_decay	.	+
chr1	100007033	100007156	AC118553.2|ENST00000639171|nonsense_mediated_decay	.	+
chr1	100007033	100007156	AC118553.2|ENST00000640238|nonsense_mediated_decay	.	+
chr1	100007033	100007156	AC118553.2|ENST00000640357|nonsense_mediated_decay	.	+
chrY	9907662	9908139	TSPY13P|ENST00000338964|unprocessed_pseudogene	.	-
chr1	100007033	100007156	SLC35A3|ENST00000370153|protein_coding	.	+
chr1	100007033	100007156	SLC35A3|ENST00000370155|nonsense_mediated_decay	.	+
chrY	9951552	9951661	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chrY	9952122	9952198	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chrY	9957439	9957552	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chrY	9958418	9958529	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chrY	9958609	9958698	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chrY	9959111	9959423	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
chrY	9910797	9910854	TTTY23|ENST00000452889|lincRNA	.	+
chrY	9910967	9911113	TTTY23|ENST00000452889|lincRNA	.	+
chr1	100000636	100000739	RNU6-1318P|ENST00000365389|snRNA	.	-

La commande uniq possède une option qui permet de savoir combien d'itérations ont été condensées -c (count). Essayez de la rajouter.

In [37]:
# Afficher les lignes de façon unique en comptant le nombre d'itérations condensées
uniq -c 05_short.bed
      1 chr1	100007033	100007156	AC118553.2|ENST00000638792|protein_coding	.	+
      1 chr1	100007033	100007156	AC118553.2|ENST00000638968|nonsense_mediated_decay	.	+
      1 chr1	100007033	100007156	AC118553.2|ENST00000639037|protein_coding	.	+
      1 chr1	100007033	100007156	AC118553.2|ENST00000639040|nonsense_mediated_decay	.	+
      1 chr1	100007033	100007156	AC118553.2|ENST00000639171|nonsense_mediated_decay	.	+
      1 chr1	100007033	100007156	AC118553.2|ENST00000640238|nonsense_mediated_decay	.	+
      1 chr1	100007033	100007156	AC118553.2|ENST00000640357|nonsense_mediated_decay	.	+
      1 chrY	9907662	9908139	TSPY13P|ENST00000338964|unprocessed_pseudogene	.	-
      1 chr1	100007033	100007156	SLC35A3|ENST00000370153|protein_coding	.	+
      1 chr1	100007033	100007156	SLC35A3|ENST00000370155|nonsense_mediated_decay	.	+
      1 chrY	9951552	9951661	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
      1 chrY	9952122	9952198	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
      1 chrY	9957439	9957552	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
      1 chrY	9958418	9958529	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
      1 chrY	9958609	9958698	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
      1 chrY	9959111	9959423	RBMY2OP|ENST00000447105|unprocessed_pseudogene	.	+
      1 chrY	9910797	9910854	TTTY23|ENST00000452889|lincRNA	.	+
      1 chrY	9910967	9911113	TTTY23|ENST00000452889|lincRNA	.	+
      2 chr1	100000636	100000739	RNU6-1318P|ENST00000365389|snRNA	.	-

Le ctrl + f de la ligne de commande¶

Mais en mieux¶

Cette dernière commande est grep. Elle permet l'équivalent d'un ctrl + f et affiche toutes les lignes contenant l'expression recherchée (aussi appelée "motif").

Elle s'écrit grep "ce que nous cherchons" fichier. Par défaut, la commande est sensible à la casse.

Son manuel est particulièrement rempli car il est possible de faire de nombreuses choses, telles que :

  • -f : Rechercher chaque motif d'un fichier dans un autre fichier
  • -i : Ignorer la casse
  • -v : Rechercher toutes les lignes qui ne contiennent pas notre expression
  • -c : Afficher le nombre de ligne contenant le motif

Affichez les lignes contenant le mot "protein" du fichier 05_short.bed.

In [18]:
# Recherche le motif "protein"
grep "protein" 05_short.bed
chr1	100007033	100007156	AC118553.2|ENST00000638792|protein_coding	.	+
chr1	100007033	100007156	AC118553.2|ENST00000639037|protein_coding	.	+
chr1	100007033	100007156	SLC35A3|ENST00000370153|protein_coding	.	+

Sans les compter à la main, combien y a-t-il de lignes concernées ?

In [19]:
# Savoir combien de ligne contient le motif "protein"
grep -c "protein" 05_short.bed
3

Redirections¶

Depuis le début nous affichons beaucoup de chose dans ce fichier. Mais parfois on a besoin de stocker le résultat obtenu ou encore de faire deux commandes à la suite.

Par exemple, si je veux savoir combien de chromosomes sont annotés dans mon fichier, je dois d'abord isoler la première colonne, puis la trier et enfin enlever la redondance. Mais comment faire ?

Il faut voir chaque outil comme un processus de transformation.

  • En entrée, dite entrée standard, on met un fichier ou du texte (un flux de texte)
  • Dans le processus de transformation, la commande fait ce qu'on a demandé
  • En sortie, deux options :
    • Tout va bien, c'est la sortie standard, aussi nommée stdout
    • Il y a une erreur, c'est la sortie erreur, aussi nommée stderr

Drawing

Quelques soit les sorties (standard ou erreur), elles peuvent être écrites dans un fichier plutôt qu'affichées à l'écran :

  • Pour la sortie standard, on utilise le caractère > ou 1> en fin de ligne, suivi du nom du fichier où l'on va la stocker : commande > fichier_sortie.txt. Si on souhaite stocker de l'information à la suite d'un fichier déjà existant, on double le caractère >>. Par exemple : commande >> fichier_sortie_existant.txt
  • Pour la sortie erreur, on utilise 2> en fin de ligne, suivi du nom du fichier d'erreur où l'on va la stocker : commande 2> fichier.log
  • Pour stocker les deux, on utilise &> suivi du nom du fichier de stockage : commande &> fichier_standard_et_erreur.txt

Si on souhaite utiliser directement la sortie standard, cette dernière peut devenir l'entrée standard d'une autre commande (Comme c'est pratique !).

C'est comme si vous associiez deux processus par un tube leur permettant de passer les données de l'un à l'autre. Pour cela, on utilise le caractère | pour séparer les deux commandes.

Drawing

Essayons ensemble ! Combien de fichiers ai-je dans mon dossier courant ?

Etape 1 :

  1. Lister les fichiers présents dans mon dossier

Etape 2 :

  1. Compter le nombre de lignes affichées
In [34]:
# Définir le nombre de fichier d'un dossier sans les compter à la main
ls | wc -l
2

Autre exemple : Donnez la liste non redondante des chromosomes présents dans le fichier hg38_exons.bed

Etape 1 :

  1. Isolez la colonne 1 du fichier qui contient le nom des chromosomes

Etape 2 :

  1. Triez la sortie

Etape 3 :

  1. Enlevez la redondance

En résumé :

Enchainez les commandes cut, sort et uniq

In [36]:
# Afficher une liste d'information non redondante
cut -f1 hg38_exons.bed | sort | uniq
chr1
chr10
chr11
chr12
chr13
chr14
chr15
chr16
chr17
chr18
chr19
chr2
chr20
chr21
chr22
chr3
chr4
chr5
chr6
chr7
chr8
chr9
chrX
chrY

Et si vous souhaitiez savoir combien vous possédez d'itérations pour chaque chromosome ?

In [38]:
# Afficher une liste d'information non redondante avec l'information du nombre d'itérations
cut -f1 hg38_exons.bed | sort | uniq -c
 117347 chr1
  46414 chr10
  75294 chr11
  72970 chr12
  20371 chr13
  43618 chr14
  47068 chr15
  60375 chr16
  77950 chr17
  22378 chr18
  73716 chr19
  97092 chr2
  28097 chr20
  14332 chr21
  27854 chr22
  80596 chr3
  49351 chr4
  55719 chr5
  56433 chr6
  60961 chr7
  45192 chr8
  45468 chr9
  39510 chrX
   3764 chrY

Une dernière pour la route, version hard core !

Dans le fichier hg38_exons.bed, sur le chromosome 22, combien y a-t-il de gènes codants uniques ? Stockez le résultat dans un fichier nommé nb_gene.txt

Etape 1 :

  1. Recherchez les lignes contenant "chr22"

Etape 2 :

  1. Dans les lignes sélectionnées, cherchez celles contenant "protein_coding"

Etape 3 :

  1. Conservez la colonne contenant les noms de gènes (colonne 4)

Etape 4 :

  1. Triez les lignes

Etape 5 :

  1. Retirez la redondance

Etape 6 :

  1. Comptez le nombre de ligne

Etape 7 :

  1. Stockez le tout dans un fichier nb_gene.txt

En résumé :

Enchainez les commandes grep, grep à nouveau, cut, sort, uniq et wc.

In [45]:
# Déterminer le nombre de gène unique sur le chromosome 22 dans le fichier
grep "chr22" hg38_exons.bed | grep "protein_coding" | cut -f4 | \
sort | uniq | wc -l > nb_gene.txt

The end¶

Bravo d'être arrivés jusqu'ici, vous avez mérité votre pause !