Le traitement de fichiers texte avec AWK


Premiers pas avec awk

Présente l’outil awk et montre sa philosophie à travers quelques exemples basiques.

AWK est un outil puissant de traitement de fichier texte qui comporte son propre langage. Encore faut-ll en connaitre la philosophie. Cet article vous propose de démarrer en douceur avec quelques manipulations de bases. Il vous montrera également que cet outil est particulièrement adapté aux fichiers organisés en lignes et colonnes.


 Installation

Installation sur des systèmes de types UNIX/LINUX

Si vous êtes sous Linux ou un système basé sur UNIX comme MacOS, cet outil devrait être déjà installé et si ce n’était pas les cas vous devriez le trouver dans dans votre gestionnaire de paquet.

Installation sous Windows

Sous Windows , il existe un programme d’installation que vous pourrez trouver :

ici

Le programme sera installé par défaut dans :

C:\Program Files (x86)\GnuWin32\bin

Des scripts d’exemples se trouvent dans :

C:\Program Files (x86)\GnuWin32\share\awk

Vous aurez également une documentation en anglais dans le dossier :

C:\Program Files (x86)\GnuWin32\doc\gawk\3.1.6\gawk-3.1.6

ainsi que le fichier correspondant à la commande man unix dans ce dossier :

C:\Program Files (x86)\GnuWin32\man\pdf

Pour utiliser simplement gwak sous Windows, vous devrez ajouter le chemin des bin à votre variable d’environnement PATH.

 Les différentes versions

Il y a eue plusieurs évolutions de cet outil. Du AWK de départ est venue NAWK (New AWK) puis GWAK (GNU WAK).

Pour connaître votre version installée tapez simplement :

$>awk –version

Ce qui donne sous Ubuntu 14.4 ...

Nous pouvons constater, qu’en tapant awk, c’est en fait GAWK qui est exécuté.

Ce qui donne sous Windows...

Sous MaCOS X,

Awk est bien installé par défaut. Par contre, MacOS étant basé sur un noyau UNIX, ce n’est pas une version GNU et il se peut que certaines options ne soient pas supportées.

 Le modèle de programmation

Le principe de AWK est de définir un filtre de sélection, généralement sous la forme d’une RegEx et une ou plusieurs actions. L’outil appliquera, sur chaque ligne du fichier texte à traiter, ce filtre et en fonction du résultat, appliquera ou pas la ou les actions spécifiées. AWK est idéal pour manipuler des fichiers textes organisés en lignes et colonnes, chaque ligne pouvant correspondre à un enregistrement et chaque colonne à un champ de cet enregistrement. Il est pratique également, pour formater des lignes qui seraient mal agencées.

Awk peut être appelé selon 2 modes. On peut l’utiliser en une seule ligne de commande avec la syntaxe suivante :

awk [-Fc] 'motif {action}' fichier

-F permet de définir le caractère de séparation des colonnes. Entre cote, le motif et l’action qui devra être effectuée. L’action doit se trouver entre accolades. Pour définir plusieurs actions, il faudra les séparer par un point-virgule. On peut également initialiser des variables puis indiquer le nom du fichier à traiter. Si aucun fichier n’est spécifié, c’est l’entrée standard qui sera traitée. Cela permet d’utiliser awk dans un tube en sortie d’une autre commande. Le résultat sera dirigée vers la sortie standard par défaut, en l’occurrence l’écran.

La seconde manière va être d’appeler awk en spécifiant un fichier script qui contiendra le traitement à effectuer :

awk -f fichier_script fichier

-f indique que l’on va spécifier un fichier contenant les instructions de traitements avant le nom du fichier à traiter.

La première syntaxe sera utilisée lorsque le traitement sera simple mais si celui-ci est plus complexe, il vaudra mieux le définir dans un fichier script et utiliser la seconde syntaxe.

Nous verrons par la suite que l’on peut définir une section BEGIN et une END pour réaliser des opérations avant et après traitement du fichier.

 Première utilisation de awk

Exécuter awk sans aucun paramètres vous permettra d’avoir un résumé de toutes les options de la commande :

awk

Ce qui donne...

 Bonjour Monde en AWK

Création du fichier test

Comme awk est fait pour manipuler les lignes d’un fichier, nous allons d’abord créer un fichier texte contenant une simple ligne.

$>echo "Proust Marcel" > fichier01

Vérifions le contenu du fichier :

Définition d’une action

Maintenant, nous allons créer notre premier script awk. Nous utiliserons la commande print pour écrire notre chaîne de caractère. Ce qui va donner :

Nous allons maintenant ajouter quelques lignes à notre fichier texte :

Vérifions le contenu du fichier :

Lançon de nouveau notre commande awk :

Nous voyons que le message est affiché 5 fois, ce qui correspond au nombre de lignes de notre fichier et nous permet de vérifier que l’action, afficher un message, est exécutée pour chaque ligne du fichier à traiter.

Voilà, nous avons vu le principe de fonctionnement de awk.

Définition d’un filtre et d’une action dans un fichier script

Nous allons maintenant utiliser un fichier script indépendant pour définir notre filtre et notre action.

Dans un éditeur de texte nous allons écrire le script qui se trouvait entre le cote de la commande précédente :

Avec vi par exemple :

$>vi script01.awk

Et entrez le code suivant :

  1. /Proust/ {
  2.         print "Bonjour le Monde";
  3. }

Télécharger

Exécutons awk en utilisant le script :

Le script que nous avons défini indiquait d’exécuter la commande print que pour les lignes contenant le mot Proust. Comme une seule ligne contenait le mot "Proust", la commande c’est bien exécuté une fois.

 Les bloc BEGIN et END

Nous allons maintenant voir comment définir une action avant et après traitement du fichier. On pourrait le faire directement en ligne de commande mais il est plus clair d’utiliser un fichier script.

Nous allons donc modifier notre script pour ajouter un bloc BEGIN et END.

  1. BEGIN {
  2.         print "Exemple de script";
  3.         print "=================";
  4. }
  5. /Proust/ {
  6.         print "Bonjour le Monde";
  7. }
  8. END {
  9.         print "=================";
  10.         print "Fin de traitement";
  11. }

Télécharger

Exécutons-le :

$>awk -f script01.awk fichier01

Ce qui donne le résultat suivant :

Nous allons pouvoir commencer à voir comment manipuler le contenu des fichiers.

 Manipuler le contenu du fichier

Par défaut awk considère que le fichier est composé de lignes séparées par un code de retour à la ligne ’\n’ et que chaque champs ou colonne est séparé par une tabulation ou des espaces. Nous disposons aussi d’un certain nombre de variables qui permettent de récupérer le contenu d’une ligne.

$0 pour l’ensemble de la ligne puis $1,$2,... pour des colonnes spécifiques.

Voyons comment récupérer les lignes du fichier :

$>awk ' { print $0 } ' fichier01

ce qui donne bien l’ensemble des lignes du fichier :

Si nous ne désirons afficher que la seconde colonne :

$>awk ' { print $2 } ' fichier01

ce qui donne :

Nous pouvons également utiliser des chaînes et des variables dans une même instruction print.

$>awk ' { print "nom: ", $1, "prénom: ", $2 } ' fichier01

Cequi donne :

Nous pourrions vouloir que les colonnes soient alignée en insérant une tabulation :

$>awk ' { print $1, "\t", $2 } ' fichier01

Ce qui donne :

Pour l’instant, nous n’avons réalisé que des traitements basiques. Pour aller plus loin, la première chose à faire va être de connaître un certain nombre de variables que nous propose awk. Vous trouverez un détail de ces variables en consultant l’article Les variables systèmes de awk

 Utilisation des variables prédéfinies de awk

Nous avons souvent besoin de manipuler des fichier .csv dont le séparateur est le ;.

Nous prendrons comme exemple, le fichier dont voici un extrait :

Si vous utilisez awk directement en ligne de commande, vous pourrez utiliserer la commande suivante :

1$>awk -F";" '{print $1, $2}' compositeurs.csv

Ce qui donnera :

Dans un script vous pourrez initialiser la variable FS. Dans l’exemple suivant, nous utiliserons également la variable OFS pour définir un caractère spécifique en sortie. En entrés nous avons un ; et en sortie nous définirons un \.

  1. BEGIN {
  2.         FS=";";
  3.         OFS="\\";
  4. }
  5. {
  6.         print $1,$2;
  7. }

Télécharger

Remarque : Comme le caractère \ est un caractère spécial, nous devons le préfixer par un autre \ sur le même principe que \t par exemple.

Le résultat donne bien ce que nous voulions.

 Pour aller plus loin : variables et regex

awk dispose d’un véritable langage de programmation qui vous permet de définir des variables simples, des tableaux, de gérer les conditions et des structures de boucles avec tous les types d’opérateurs que l’on peut trouver dans les autres langages avec une syntaxe proche du C. Comme le sujet est vaste, je me contenterais de vous fournir un dernier exemple qui utilise une variable et une expression. J’en profiterais également pour vous montrer l’utilisation d’une autre fonction d’affichage printf()

L’exemple suivant va utiliser un fichier .csv contenant l’ensemble des codes postaux dont voici un extrait :

Le but du script suivant va être de lister les communes des Hauts de Seines et d’en indiquer le nombre.

  1. BEGIN {
  2.         FS=";";
  3.         nb = 0;
  4.         print "Liste des communes:";
  5.         print "-------------------";
  6. }
  7. $1 ~ /^92/ {
  8.         print $2;
  9.         nb++;
  10. }
  11. END {
  12.         print "---------------------------------------------------------";
  13.         printf( "Les Hauts de Seines sont composées de %d communes\n", nb );
  14. }

Télécharger

On l’exécute avec la commande suivante :

awk -f script01.awk cp02.csv

Ce qui donne :

Voyons maintenant quelques explications

Dans la partie BEGIN nous utilisons à la fois la variable système vue précédemment. Nous créons également une variable nb. Nous voyons que en awk nous n’avons pas besoin de la déclarer ni de lui spécifier le type.

Dans la section de traitement des lignes nous effectuons un test sur la première colonne $1 avec une expression régulière /^92/ qui veut dire que l’on recherche tout ce qui commence par "92". Ce qui est important de noter est l’opérateur utilisé entre la variable et l’expression régulière qui est le symbole ~. Il existe un autre symbole pour dire que l’on prend tout sauf ce qui correspond au motif. Il s’agit de !~.

Dans la section END, j’utilise la fonction printf() qui s’utilise comme en langage C. Le premier paramètre est la chaîne de formatage avec "%d" qui sera remplacé par le contenu du paramètre suivant. Vous remarquerez que je termine par un "\n" pour aller à la ligne car par défaut et contrairment à print, la fonction printf() ne génère pas de retour à la ligne.

 Conclusion

Voila, nous en avons terminé avec ce petit article qui ne se voulait qu’une présentation de la philisophie de awk et de comprendre à quoi ce langage pouvait servir. On voit par exemple, que contrairement à des langages plus classiques, nous n’avons pas besoin de se préoccuper de l’ouverture et de la fermeture du fichier à traiter ni à gérer le changement de ligne ni de tester si nous étions arrivé en fin de fichier.

Article n° 38

Crée par: chris

Créé le: 4 novembre 2015

Modifié le: 4 novembre 2015

Nombre de visites: 1735

Popularité: 14 %

Popularité absolue: 1

Mots clés de cet article


SPIP

2003-2024 LePpf
Plan du site | | RSS 2.0 | Sur YouTube

Visiteurs connectés : 7

Nombre moyen de visites quotidiennes sur le site: 198