Survoler awk

awk est un langage de programmation pour manipuler du texte. Il est souvent employer pour extraire et formater des données. Il est presque toujours présent par défaut sur les systèmes d'exploitation de type Unix.

Les bases

Nos commandes peuvent être directement dans le terminal ou sinon dans un fichier avec l'extension .awk:

awk 'mes_instructions_awk' données-a.csv données-b.csv

awk -f instructions.awk données-c.csv données-d.csv

Règle et action

Un programme awk consiste en un ensemble de pair de règles et d'actions. Il peut y avoir autant de ces pairs que nous en avons besoin.

Chaque pair sera éxécutée indépendamment des autres, et si une ligne correspond à plus d'une règle, elle aura plus d'une action correspondante.

une règle { une action }
une autre règle { une autre action }
3e règle { 3e action }
... Etc.

Le point virgule est utilisé pour séparer des commandes qui seraient sur une même ligne:

une règle { une action }; une autre règle { une autre action }

Il existe des règles spécifiques comme BEGIN et END pour des actions à faire au début et à la fin du traitement.

BEGIN { ... }

END { ... }

Avec données

Pour les besoins de notre exploration, je suis aller piger dans les données ouvertes de la Société de transport de Lévis (STL). Nous allons utiliser les donneées sur les trajets que j'ai reproduis dans ce fichier: awk-data-sample.txt.

awk possède des variables prédéfinies et NR est une de celles-là. Elle nous retourne le nombre de lignes lues jusqu'à présent.

Nous pouvons nous en servir pour regarder les dix premières lignes de notre fichier de données:

awk 'NR <= 10' awk-data-sample.txt

Quand les commandes ne spécifient pas d'action, print est choisie implicitement; ce qui nous retourne ceci:

route_id,service_id,trip_id,trip_headsign,trip_short_name,direction_id,block_id,shape_id,wheelchair_accessible
11A,2,344166,Terminus de la Traverse / Hôtel-Dieu de Lévis / UQAR / Lauzon,,1,44,48170_1170677_1170774,1
11A,2,344167,Terminus de la Traverse / Hôtel-Dieu de Lévis / UQAR / Lauzon,,1,44,48170_1170677_1170774,1
11A,2,344168,Terminus de la Traverse / Hôtel-Dieu de Lévis / UQAR / Lauzon,,1,44,48170_1170677_1170774,1
11A,2,344169,Terminus de la Traverse / Hôtel-Dieu de Lévis / UQAR / Lauzon,,1,44,48170_1170677_1170774,1
11A,2,344170,Terminus de la Traverse / Hôtel-Dieu de Lévis / UQAR / Lauzon,,1,44,48170_1170677_1170774,1
11A,2,344171,Terminus de la Traverse / Hôtel-Dieu de Lévis / UQAR / Lauzon,,1,44,48170_1170677_1170774,1
11A,2,344172,Terminus de la Traverse / Hôtel-Dieu de Lévis / UQAR / Lauzon,,1,44,48170_1170677_1170774,1
11A,2,344173,Terminus de la Traverse / Hôtel-Dieu de Lévis / UQAR / Lauzon,,1,44,48170_1170677_1170774,1
11A,2,344174,Terminus de la Traverse / Hôtel-Dieu de Lévis / UQAR / Lauzon,,1,44,48170_1170677_1170774,1

Ici nous voyons les en-têtes sur la première ligne, puis ensuite les entrées elles-mêmes, sur les ligne suivantes. Et nous constatons que les données sont séparées par des virgules.

Pour avoir accès aux données seulement il nous faut ignorer la première ligne qui contient les en-têtes:

awk 'NR > 1' awk-data-sample.txt

Le séparateur

Par défaut, awk considère l'espace comme séparateur. Nous pouvons en paramètrer un autre avec l'étiquette -F:

awk -F ',' 'NR <= 10 { print $1 }' awk-data-sample.txt

La commande ci-dessus, permet d'utiliser la virgule comme séparateur et nous affiche le premier champ des dix premières lignes…

route_id
11A
11A
11A
11A
11A
11A
11A
11A
11A

Sources / Ressources