Astuce :
Commandline Tips : Extraction du x-ième champ d'un fichier organisé en colonne

But : Dans un fichier organisé en colonne, extraire la (ou les) colonne(s) qui nous intéressent

Prérequis : Savoir utiliser grep est un plus.

Difficulté : 1/5 (Facile)

Nous souhaitons dans le fichier PDB 6CSC  extraire la première et la quatrième colonne des lignes débutant par le mot clef "ATOM"

Préparation des données :

La première chose à faire est d'extraire les lignes contenant avec mot clef "ATOM", pour cela nous allons utiliser grep. L'utilisation la plus simple de cet utilitaire demande deux arguments qui sont la chaîne recherchée et le fichier à fouiller.

Le lecteur attentif aura remarqué que des guillemets sont présents et qu'un espace a été rajouté. Les deux sont liés, lorsque nous filtrons sur le mot clef seul, grep nous renvoient des ligne de commentaires contenant le mot ATOMS que nous ne souhaitons pas. Les lignes qui nous intéressent contiennent le mot clef immédiatement suivit d'un espace et l'espace nous oblige à rajouter des guillemets. Une autre solution aurait pu être : grep ATOM 6CSC.pdb | grep -v ATOMS  l'option "-v" permettant de sélectionner toutes les lignes qui ne contiennent pas le mot clef, le caractère | (dit pipe) il sera expliqué plus loin.

Voici un extrait du résultat des deux commandes :

Commande : Awk
Nous allons maintenant passer à la sélection de la première et quatrième colonne. Nous allons utiliser l'utilitaire awk dans son usage le plus basique, l'exemple ci-dessus ne nous permet pas d'utiliser la commande cut, j'en parlerai tout de même à la fin de l'article.

Le caractère "|" signifie pipe, il prend le résultat de la commande à sa gauche pour l'envoyer comme "fichier" d'entrée à la commande à sa droite. Tout étant fichier sous linux, ceci est fait de manière transparente.

L'argument passé à awk, qui à son propre langage de programmation, est le suivant ' { print $1, $4 } '

  • Ce que nous avons placé entre guillemet simple est le script qui va être exécuté, nous aurions aussi pu utiliser l'option -f filename et stocker le script dans un fichier.
  • $1 et $4 sont respectivement le contenu des colonnes 1 et 4, par défaut awk utilise l'espace comme séparateur, qu'il y en ait un ou plusieurs, c'est la même chose.
  • Les accolades délimitent ce qui est appelé un "bloc-programme" qui regroupe un ensemble de traitement à effectuer.
  • La virgule permet lors de l'affichage, fait avec la fonction print, de séparer avec un espace la première et la quatrième colonne.

Quelques informations supplémentaires :

  • $0 permet d'afficher la ligne entière
  • L'option -F permet de définir le délimiteur, un exemple est présent à la fin de cet article

Commande : cut

Je souhaite maintenant faire la même chose avec l'utilitaire cut, celui ci n'a pas la plasticité d'awk et il est nécessaire que chaque colonne soit séparé par un seul et unique délimiteur. C'est pourquoi j'ai repris le résultat de la première commande grep et remplacé les espaces entres les différents termes par des ":" (format CSV pour les puristes). La manière de procéder au remplacement sera expliqué dans un prochain article.

Quelques explications : nous demandons à cut d'afficher les champs 1 et 4 (field option -f) délimité par le séparateur ";" (delimiter option -d).

Comme toujours , il est possible d'obtenir le même résultat de plusieurs façons :

 Liens

 

Catégorie: Astuce | Tags: , ,

7 commentaires sur “Commandline Tips : Extraction du x-ième champ d'un fichier organisé en colonne

  1. Le séparateur utilisé dans le cut (cut -d ";" -f 1,4 6CSC.csv) ne devait pas plutôt être ':' au lieu de ';' ?

    • Bien sur ! Correction effecutée

  2. Il aurait été possible de se passer de grep car awk peut filter les lignes tout seul
    awk ' $1=="ATOM" { print $1, $4 } '

    • Effectivement, pour introduire un outil supplémentaire mon choix s'est porté sur grep. Mais aux vues des possibilités offertes par awk, je pense faire un article plus large sur cet outil, j'en parlerai à ce moment là.

  3. Ca, c'est un super article mémo, j'oublie à chaque fois comment faire :D

  4. Pouvez-vous expliquer comment vous faites pour remplacer les espaces entre les différents termes par ":" ?

    • Il doit s'agir de la commande Sed suivante:

      cat monFichier | sed "s/ /:/g" > monNouveauFichier

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">