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