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 :
- Il contient des annotations avec leurs coordonnées (début/fin) génétiques.
- 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 (-).
- Son nom signifie Browser Extensible Format
- Il peut être au format BED6 ou BED12 (pour les plus courants). Le BED6 contient 6 colonnes et le BED12... 12 !
- 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 :
- Rendez-vous dans le dossier
chip-seq
que nous avons créé précédemment. - Créez un dossier
bed
. - Déplacez vous dans ce dossier
bed
. - Télécharger le fichier à l'adresse suivante : https://zenodo.org/record/5716151/files/hg38_exons.bed.gz
# Se rendre dans le répertoire chip-seq
cd chip-seq/
# Créer le dossier bed
mkdir bed
# Se rendre dans le dossier bed
cd bed
# 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 ?
# 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.
# 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
# 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.
# 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.
# 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.
# 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.
# Copier le fichier 05_short.bed qui se trouve deux crans en arrière
cp ../../05_short.bed .
Cette fois, essayons la commande cat
# 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 ?
# 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.
# 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)
# 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.
# 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.
# 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.
# 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.
# 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 . -
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
.
# 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 ?
# 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
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
>
ou1>
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.
Essayons ensemble ! Combien de fichiers ai-je dans mon dossier courant ?
Etape 1 :
- Lister les fichiers présents dans mon dossier
Etape 2 :
- Compter le nombre de lignes affichées
# 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 :
- Isolez la colonne 1 du fichier qui contient le nom des chromosomes
Etape 2 :
- Triez la sortie
Etape 3 :
- Enlevez la redondance
En résumé :
Enchainez les commandes cut
, sort
et uniq
# 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 ?
# 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 :
- Recherchez les lignes contenant "chr22"
Etape 2 :
- Dans les lignes sélectionnées, cherchez celles contenant "protein_coding"
Etape 3 :
- Conservez la colonne contenant les noms de gènes (colonne 4)
Etape 4 :
- Triez les lignes
Etape 5 :
- Retirez la redondance
Etape 6 :
- Comptez le nombre de ligne
Etape 7 :
- Stockez le tout dans un fichier
nb_gene.txt
En résumé :
Enchainez les commandes grep
, grep
à nouveau, cut
, sort
, uniq
et wc
.
# 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 !