Accessibility Tools

- Le blog participatif de bioinformatique francophone depuis 2012 -

Analyse de fichiers dans le bon vieux temps ! | Creative Commons 2.0, wikimedia
Ana­lyse de fichiers dans le bon vieux temps ! | Crea­tive Com­mons 2.0, wiki­me­dia

Lan­gage : shell, sous GNU/​Linux

Com­mandes pré­sen­tées :wc, awk, sed, tr, head, nl, cut

Niveau : débu­tant

Dans le cadre de notre tra­vail, nous sommes sou­vent ame­nés à mani­pu­ler de nom­breux fichiers conte­nant des mil­liers de lignes et des dizaines de champs. Dans ces cas-là, nous avons sou­vent ten­dance à virer à la para­noïa et à vou­loir nous assu­rer que nos fichiers sont bien for­ma­tés et contiennent bien le nombre de lignes, champs ou élé­ments atten­dus.

Dans ce billet, je vous pro­pose de décou­vrir ou redé­cou­vrir quelques com­mandes simples pour ana­ly­ser rapi­de­ment des fichiers.

Pour les dif­fé­rents exemples mon­trés, je vous ai pré­pa­ré de petits fichiers que vous pou­vez récu­pé­rer pour tes­ter les exemples. Vous pou­vez les récu­pé­rer en cli­quant sur les liens sui­vants :

Afficher le nombre de lignes

wc -l exemple_wc.txt

Un grand clas­sique mais c'est le meilleur moyen de s'assurer que l'on a bien le bon nombre de lignes atten­du. C'est éga­le­ment un bon moyen de véri­fier que vous n'avez pas un fichier conte­nant des retours à la ligne de Win­dows, les fameux ^M ou CRLF.
Si vous avez de tels sauts de lignes, la com­mande vous affi­che­ra 0 lignes, et la com­mande dos2unix peut vous être utile.
Résul­tat atten­du :

5 exemple_wc.txt

Retirer la première ligne d'un fichier

sed '1d' exemple_sed.txt

Ren­ver­ra sur la sor­tie stan­dard le conte­nu du fichier exemple_sed.txt sans la pre­mière ligne.
Résul­tat atten­du :

Si cette ligne est la première, c'est que vous avez bien supprimé la première ligne.
La troisième ligne.
La quatrième ligne.
La cinquième ligne.
Et toutes les autres lignes que vous voulez.

Ligne non affi­chée :

Ceci est la première ligne.

Atten­tion, sed ne sup­pri­me­ra pas la pre­mière ligne dans le fichier, la com­mande se conten­te­ra de ne pas l'afficher. Il fau­dra ajou­ter l'option -i (mode inser­tion) pour la sup­pri­mer direc­te­ment dans le fichier.
Exemple :

nolwenn@bioinfo-fr$ cp exemple_sed.txt exemple_sed_insert.txt
nolwenn@bioinfo-fr$ wc -l exemple_sed_insert.txt
6 exemple_sed_insert.txt
nolwenn@bioinfo-fr$ sed -i '1d' exemple_sed_insert.txt
nolwenn@bioinfo-fr$ wc -l exemple_sed_insert.txt
5 exemple_sed_insert.txt
nolwenn@bioinfo-fr$ cat exemple_sed_insert.txt
Si cette ligne est la première, c'est que vous avez bien supprimé la première ligne.
La troisième ligne.
La quatrième ligne.
La cinquième ligne.
Et toutes les autres lignes que vous voulez.

Afficher les numéros de colonnes d'un fichier

head -n 1 exemple_numcol.tsv | tr "\t" "\n" | nl

head -n 1 affiche la pre­mière ligne.
tr per­met de "tra­duire" la tabu­la­tion par un retour à la ligne.
nl per­met d'afficher le numé­ro de la ligne lue.

Si vous ne connais­sez pas le sym­bole pipe "|", je vous recom­man­de­rai de lire l'article sur les pipe­lines rédi­gé par Aki­ra.

Rem­pla­cer \t par le sépa­ra­teur de colonnes de votre choix.
Mer­ci à S. Letort pour cette astuce à mon arri­vée dans l'unité.
Résul­tat atten­du :

1  rs
2  pos
3  chrom

Afficher le nombre de lignes par nombre de champs

awk '{print NF}' exemple_awk.tsv | sort | uniq -c

print NF affiche le nombre de champs pour chaque ligne lue dans le fichier exemple_awk.tsv par awk.
sort tri le flux de sor­tie de awk.
uniq -c compte le nombre de lignes iden­tiques
Résul­tat atten­du :

2 3
1 5
1 9

Dans cet exemple, nous avons donc 2 lignes conte­nant 3 champs, 1 ligne conte­nant 5 champs et 1 ligne fai­sant 9 champs.

Mer­ci à A. Vaysse pour cette astuce (et pour m'avoir appris le awk).
Très utile pour véri­fier qu'un fichier à bien le bon nombre de champs pour chaque ligne.

Récupérer les champs d'intérêt d'un fichier

La com­mande cut per­met de décou­per un fichier champ par champ, ou colonne par colonne. Les champs sont consi­dé­rés comme des index, un peu comme une liste en lan­gage Python ou Perl. L'index de cut com­mence par 1, en Python et en Perl les index com­mencent par 0.

cut -f 3 exemple_cut.tsv

Affiche le champs 3.
Résul­tat atten­du :

3
c
m
w
cut -f 1,4 exemple_cut.tsv

Affiche les champs 1 et 4.
Résul­tat atten­du :

1   4
a   d
k   n
u   x
cut -f 3-7 exemple_cut.tsv

Affiche les champs 3 à 7.
Résul­tat atten­du :

3   4   5   6   7
c   d   e   f   g
m   n   o   p   q
w   x   y   z   aa
cut --complement -f 1-3 exemple_cut.tsv

Affiche tous les champs à l'exception des champs 1 à 3.
Résul­tat atten­du :

4   5   6   7   8   9   10
d   e   f   g   h   i   j
n   o   p   q   r   s   t
x   y   z   aa  bb  cc  dd

Conclusion

En conclu­sion, je vous avoue­rai que j'utilise assez fré­quem­ment ces lignes de com­mandes. En fonc­tion de la com­plexi­té des don­nées conte­nues je jongle entre ces dif­fé­rentes com­mandes tout en uti­li­sant les pipe­lines.

Il existe sûre­ment d'autres astuces que j'ai oublié ou que je ne connais pas, aus­si si vous en connais­sez je vous invite à les par­ta­ger entre nous dans les com­men­taires de ce billet !

Mer­ci à Yoann M. et Mica pour vos relec­tures et vos com­men­taires.

Vous avez aimé ? Dites-le nous !

Moyenne : 0 /​ 5. Nb de votes : 0

Pas encore de vote pour cet article.

We are sor­ry that this post was not use­ful for you !

Let us improve this post !

Tell us how we can improve this post ?




Commentaires

9 réponses à “Analyses rapides de fichiers”

  1. Avatar de Cédric

    Mer­ci pour cet article. Pour la véri­fi­ca­tion de fichiers et bien au delà, voi­ci deux mines de one-line en sed et en awk dans les­quelles je vais sou­vent fouiller.

  2. D'une manière géné­rale en bioin­fo, il est utile d'exporter la variable d'environement

    LC_ALL=C
    
    les comparaisons se font au niveau des bytes, en ignorant les "Locale" = plus rapide. Par exemple:
    
    LC_ALL=C sort -k1,1 -k2,2 file.bed
    
    cf. http://www.biostars.org/p/45456/
    1. typo

      LC_ALL=C sort -k1,1 -k2,2n file.bed
      
      1. Mer­ci pour l'astuce, ça va être utile je pense 😉

    2. Mer­ci pour votre com­men­taire.
      Il est inté­res­sant de consta­ter les dif­fé­rences en terme de per­for­mance avec juste ce chan­ge­ment de variable d'environnement.
      Savez-vous à quoi cela est-il dû ?

  3. Avatar de Nicolas Belouin
    Nicolas Belouin

    Si j'ai bien com­pris la chose. Cela est dû au fait que, par défaut, l'environnement uti­lise l'encodage UTF-8 qui peut rem­plir jusqu'à 4 octets et néces­site l'ouverture de plu­sieurs fichiers. En pas­sant la com­mande LC_ALL=C, on défi­nit un jeu de carac­tère ASCII enco­dé sur un seul octet néces­si­tant moins d'ouvertures. Je sup­pose que les chaînes de carac­tères en sont trai­tés plus rapi­de­ment et les accès disque moins nom­breux.
    Par contre il faut faire atten­tion, LC_ALL=C modi­fie le com­por­te­ment de la com­mande sort :
    par défaut :
    a
    A
    b
    B

    avec LC_ALL=C
    A
    B
    C
    a
    b
    c

    En espé­rant ne pas dire trop de bêtises, et mer­ci pour les petites astuces 😉

  4. Avatar de Alexis MICHON
    Alexis MICHON

    Très bon job de résu­mer des com­mandes utiles.

  5. Avatar de Amandine

    Mer­ci pour ces astuces !

  6. Avatar de Aymeric Inpong
    Aymeric Inpong

    "Bel article d'apprentissage ! Ayme­ric Inpong"

Laisser un commentaire

Pour insérer du code dans vos commentaires, utilisez les balises <code> et <\code>.