Astuce :
Command line Tips : passage de variable dans awk

But : Dans un fichier organisé en colonnes, nous allons extraire les lignes contenant un mot (donné en argument) dans une colonne fixée à l'avance (1ère colonne).

Prérequis : Connaître un peu le shell (pour l'exercice).

Difficulté : 2/5 (Facile)

Exercice : Pour agrémenter la note, on extraira dans quatre fichiers distincts les lignes contenant les quatre mots les plus représentés du fichier PDB ci-dessous (un mot, un fichier). On pourra nommer les fichiers sous la forme "mot.txt".

PDB 6CSC

Dans une note récente, Leo_01 nous détaillait plusieurs moyens d'extraire des colonnes d'un fichier. Je vous encourage à lire sa note (surtout si vous ne connaissez pas awk).

awk est un interpréteur et un langage qui permet d'appliquer un script à des fichiers texte plutôt organisés en colonnes. Très pratique pour des fichiers de tailles raisonnables, il ne faut pas trop espérer traiter plusieurs millions de lignes sans un peu d'attente (variable suivant la machine bien sûr). Il existe différentes versions de awk, gawk, mawk et nawk (liste pas forcément exhaustive), mais toutes ses versions étant POSIX, elles devraient être disponibles sur tout système POSIX et se comporter de manière identique.
La ligne de commande classique tel que décrite par le man prend la forme suivante :

ou

En général, j'utilise la première forme de ligne de commande. La deuxième peut avoir un intérêt si on veut générer le script de manière "dynamique" ou pour une question de lisibilité.
Parmi les options, la plus importante est probablement -F permettant d'indiquer le séparateur de champs mais celle qui va nous intéresser aujourd'hui est -v pour variable; extrait du man:
-v var=value assigns value to program variable var.

Exemple sans fichier d'entrée :

Ici, on notera l'utilisation du mot clef "BEGIN" qui regroupe des instructions qui ne seront exécutées qu'une seule fois avant la lecture du fichier.
La structure d'un script awk prend la forme d'un bloc BEGIN{} (optionel), d'un bloc (optionel) sans étiquette simplement délimité par {} qui sera appliqué à chaque ligne du fichier et pour finir d'un bloc END{} (optionel) dont les instructions ne seront éxécutées qu'une seule fois après la fin de la lecture du fichier. L'interet des ces blocs se trouve par exemple pour calculer la moyenne d'une colonne. On initialiserait une variable dans un BEGIN, on sommerait les valeurs dans le bloc {} puis on afficherait la moyenne dans le bloc END.
Anecdote : le script le plus complet qui ne ferait rien serait donc 'BEGIN{}{}END{}'.
Note : on peut passer plusieurs variables en répétant l'option "-v".

Nous pouvons maintenant répondre à la question de départ. Nous allons extraire les lignes dont la première colonne contient le tag COMPND du fichier PDB.

Comme il faut être feignant, j'aurais écrit

ce qui donne le même résultat.

Pour continuer à jouer un peu avec -v, on peut aussi l'utiliser pour choisir des colonnes au moment de l'exécution. Pour cela, il suffit d'ajouter un "$" devant le nom de la variable :

Comme présenté dans la note de Leo_01, nous pourrions faire un grep pour extraire des lignes, mais ici l'avantage est de pouvoir en plus spécifier la colonne dans laquelle on cherche le mot.
Voila, c'est tout pour cette fois. Je pense que vous êtes prêt à passer à la pratique et à résoudre l'exercice en un tour de main. Au pire la solution se trouve plus bas (passer le curseur de la souris dessus pour la voir apparaitre).

[spoiler]

[/spoiler]

  • À propos de

Un commentaire sur “Command line Tips : passage de variable dans awk

  1. trés bon article pour debuter avec les cluster merci !!!!!

Laisser un commentaire

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