Analyses rapides de fichiers

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

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 :

Retirer la première ligne d'un fichier

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 :

Ligne non affi­chée :

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 :

Afficher les numéros de colonnes d'un fichier

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 :

Afficher le nombre de lignes par nombre de champs

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 :

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.

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

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

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

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

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.



Pour continuer la lecture :


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. Avatar de Nolwenn

      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