Astuce :
Analyses rapides de fichiers

Analyse de fichiers dans le bon vieux temps ! | Creative Commons 2.0, wikimedia

Analyse de fichiers dans le bon vieux temps ! | Creative Commons 2.0, wikimedia

Langage : shell, sous GNU/Linux
Commandes présentées : wc, awk, sed, tr, head, nl, cut
Niveau : débutant

Dans le cadre de notre travail, nous sommes souvent amenés à manipuler de nombreux fichiers contenant des milliers de lignes et des dizaines de champs. Dans ces cas-là, nous avons souvent tendance à virer à la paranoïa et à vouloir nous assurer que nos fichiers sont bien formatés et contiennent bien le nombre de lignes, champs ou éléments attendus.

Dans ce billet, je vous propose de découvrir ou redécouvrir quelques commandes simples pour analyser rapidement des fichiers.

Pour les différents exemples montrés, je vous ai préparé de petits fichiers que vous pouvez récupérer pour tester les exemples. Vous pouvez les récupérer en cliquant sur les liens suivants :

Afficher le nombre de lignes

Un grand classique mais c'est le meilleur moyen de s'assurer que l'on a bien le bon nombre de lignes attendu. C'est également un bon moyen de vérifier que vous n'avez pas un fichier contenant des retours à la ligne de Windows, les fameux ^M ou CRLF.
Si vous avez de tels sauts de lignes, la commande vous affichera 0 lignes, et la commande dos2unix peut vous être utile.
Résultat attendu :

Retirer la première ligne d'un fichier

Renverra sur la sortie standard le contenu du fichier exemple_sed.txt sans la première ligne.
Résultat attendu :

Ligne non affichée :

Attention, sed ne supprimera pas la première ligne dans le fichier, la commande se contentera de ne pas l'afficher. Il faudra ajouter l'option -i (mode insertion) pour la supprimer directement dans le fichier.
Exemple :

Afficher les numéros de colonnes d'un fichier

head -n 1 affiche la première ligne.
tr permet de "traduire" la tabulation par un retour à la ligne.
nl permet d'afficher le numéro de la ligne lue.

Si vous ne connaissez pas le symbole pipe "|", je vous recommanderai de lire l'article sur les pipelines rédigé par Akira.

Remplacer \t par le séparateur de colonnes de votre choix.
Merci à S. Letort pour cette astuce à mon arrivée dans l'unité.
Résultat attendu :

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 sortie de awk.
uniq -c compte le nombre de lignes identiques
Résultat attendu :

Dans cet exemple, nous avons donc 2 lignes contenant 3 champs, 1 ligne contenant 5 champs et 1 ligne faisant 9 champs.

Merci à A. Vaysse pour cette astuce (et pour m'avoir appris le awk).
Très utile pour vérifier 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 commande cut permet de découper un fichier champ par champ, ou colonne par colonne. Les champs sont considérés comme des index, un peu comme une liste en langage Python ou Perl. L'index de cut commence par 1, en Python et en Perl les index commencent par 0.

Affiche le champs 3.
Résultat attendu :

Affiche les champs 1 et 4.
Résultat attendu :

Affiche les champs 3 à 7.
Résultat attendu :

Affiche tous les champs à l'exception des champs 1 à 3.
Résultat attendu :

Conclusion

En conclusion, je vous avouerai que j'utilise assez fréquemment ces lignes de commandes. En fonction de la complexité des données contenues je jongle entre ces différentes commandes tout en utilisant les pipelines.

Il existe sûrement d'autres astuces que j'ai oublié ou que je ne connais pas, aussi si vous en connaissez je vous invite à les partager entre nous dans les commentaires de ce billet !

 

Merci à Yoann M. et Mica pour vos relectures et vos commentaires.

  • À propos de
  • Issue d'une licence de biologie cellulaire et physiopathologie et d'un master de bioinformatique, je m'intéresse tout particulièrement au monde de la recherche et au domaine de la santé. J'ai travaillé dans l'unité 946 de l'INSERM, dirigée par Florence Demenais, où mon travail principal a été l'étude et la recherche de bases de données et d'outils d'intérêt majeur pour l'axe de recherche dans lequel j'étais impliquée. J'ai aussi travaillé à l'Institut Pasteur où j'ai été recrutée en tant qu'ingénieure bioinformaticienne dans le cadre du LabEx Milieu Intérieur et où ma mission principale a été de mettre en place une base de données pour la gestion de nos échantillons biologiques. Mes centres d'intérêt en bioinformatique sont : la mise en application de méthodes dans les domaines de la génomique, de la protéomique et les interactions gène-gène protéine-protéine pouvant nous apporter des informations sur leurs influences dans les maladies. Je travaille actuellement au service informatique de l'IBENS où j'ai été recrutée en qualité de développeuse d'applications !

Catégorie: Astuce | Tags: , , , , ,

9 commentaires sur “Analyses rapides de fichiers

  1. Merci pour cet article. Pour la vérification de fichiers et bien au delà, voici deux mines de one-line en sed et en awk dans lesquelles je vais souvent fouiller.

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

    les comparaisons se font au niveau des bytes, en ignorant les "Locale" = plus rapide. Par exemple:

    cf. http://www.biostars.org/p/45456/

    • typo

      • Merci pour l'astuce, ça va être utile je pense 😉

    • Merci pour votre commentaire.
      Il est intéressant de constater les différences en terme de performance avec juste ce changement de variable d'environnement.
      Savez-vous à quoi cela est-il dû ?

  3. Si j'ai bien compris la chose. Cela est dû au fait que, par défaut, l'environnement utilise l'encodage UTF-8 qui peut remplir jusqu'à 4 octets et nécessite l'ouverture de plusieurs fichiers. En passant la commande LC_ALL=C, on définit un jeu de caractère ASCII encodé sur un seul octet nécessitant moins d'ouvertures. Je suppose que les chaînes de caractères en sont traités plus rapidement et les accès disque moins nombreux.
    Par contre il faut faire attention, LC_ALL=C modifie le comportement de la commande 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 merci pour les petites astuces 😉

  4. Très bon job de résumer des commandes utiles.

  5. Merci pour ces astuces !

  6. "Bel article d'apprentissage! Aymeric Inpong"

Laisser un commentaire