Extraction de données rapide mais peu organisée avec AWK

Linux Gazette n°95 - Octobre 2003

Phil Hughes


Table des matières
1. Introduction
2. Le problème : extraire des données des messages électroniques
3. La solution

1. Introduction

Il y a de nombreuses années, probablement près de vingt, un point régulier était fait sur les groupes de nouvelles Usenet à propos de l'utilisation de l'outil minimal pour réaliser la tâche. En d'autres termes, quelqu'un demanderait une méthode rapide mais peu organisée de faire quelque chose et les suites données pourraient inclure une solution en C suivie d'une solution AWK, suivie d'une autre solution sed, et ainsi de suite.

Aujourd'hui, j'applique encore cette philosophie lorsque je tente de résoudre un problème. Dans ce cas particulier, j'ai choisi AWK mais si un de vous parmi les experts lit ce document, j'espère vous voir proposer une solution basée sur «sed».


2. Le problème : extraire des données des messages électroniques

Je me suis abonné à un résumé quotidien des taux de change monétaires. C'est gratuit et vous pouvez souscrire également - en vous rendant simplement à l'adresse http://www.xe.com/cus. La plupart du temps, je jette un rapide coup d'œil pour savoir comment le dollar se comporte vis-à-vis de l'euro, puis je sauvegarde le message électronique. Quelquefois, je me contente de l'enregistrer. J'ai toujours pensé qu'un jour j'écrirais un programme m'indiquant la tendance, mais ce travail a toujours eu une priorité moindre.

Hier, alors que je prenais connaissance de quelques messages enregistrés, j'ai réalisé que, même si l'écriture d'un programme esthétique d'analyse était peu prioritaire, celle d'un « bidouillage » rapide mais peu organisé prendrait moins de temps que l'échantillonnage aléatoire que je faisais. Ce que je voulais consistait en dates et en nombres, ainsi qu'en un affichage graphique minimaliste de la tendance.

La première étape a été d'examiner les données. Voici un extrait d'une partie d'un message :


>From list@en.ucc.xe.net  Wed Sep 10 12:22:53 2003
...

XE.com's Currency Update Service writes:

Here is today's Currency Update, a service of XE.com. Please read the
copyright, terms of use agreement, and information sections at the
end of this message.  CUS5D0B3D5C16D9
____________________________________________________________________________

If you find our free currency e-mail updates useful, please forward this
message to a friend! Subscribe for free at: http://www.xe.com/cus/
____________________________________________________________________________
<PRE>

Rates as of 2003.09.09 20:46:35 UTC (GMT). Base currency is EUR.

Currency Unit                          EUR per Unit         Units per EUR
================================   ===================   ===================
USD United States Dollars                 0.890585              1.12286
EUR Euro                                  1.00000               1.00000
GBP United Kingdom Pounds                 1.41659               0.705920
CAD Canada Dollars                        0.651411              1.53513
...

</PRE>

For help reading this mailout, refer to: http://www.xe.com/cus/sample.htm

...

Les lignes '...' indiquent simplement que j'ai supprimé un grand nombre de lignes sans intérêt.

Voici les trois éléments que j'emploie pour produire le rapport :


3. La solution

La partie numérique de la solution est vraiment facile. Récupérez juste les informations de date et de taux. Lorsque j'arrive à la ligne « </PRE> », je l'affiche.

La partie graphique est réalisée simplement en affichant un certain nombre de signes « plus » qui correspond au taux. Pour obtenir une résolution convenable, j'aurais besoin soit d'un affichage très large, soit d'un certain type de décalage. J'ai opté pour le décalage, en partant du principe que l'euro ne descendrait pas au-dessous de 0,90 dollar, ce qui est assez peu risqué si l'on considère son évolution actuelle.

Pour terminer, je souhaitais un intitulé. À l'aide du BEGIN d'AWK, j'ai placé trois instructions print. N'aimant pas compter les caractères, j'ai défini la variable over pour qu'elle représente le nombre d'espaces à placer avant les informations de titre pour tout aligner. Ceci signifiait simplement que je devais exécuter le programme, vérifier son fonctionnement et ajuster la variable.

Voici le code :


BEGIN		{
		over = "                 "
		print over, " Cost of Euros in $ by date"
		print over, ".9       1.0       1.1       1.2       1.3"
		print over, "|         |         |         |         |"
		}
/Rates as of/	{ date = $4 }
/^USD/		{ rate = $6 }
/^<\/PRE>/	{
		printf "%s %6.3f ", date, rate
		rc = (rate - .895) * 100
		for (i=0; i < rc; i++) printf "+"
		printf "\n"
		date = "xxx"
		rate = 0
		}

Le simple lancement du programme avec le fichier des messages fourni en entrée affiche toutes les lignes de résultat, mais l'ordre est celui du fichier des messages. Le programme sort est venu à mon secours. Le premier champ de la sortie est la date, et un choix minutieux du premier caractère des lignes de titre se traduit par un tri impeccable du total sans options. Donc, pour le lancer, utilisez :

    awk -f cc.as messages | sort

et vous obtenez votre élégant rapport. Redirigez le résultat au moyen de more si vous avez un grand nombre de lignes à examiner.

Voici un exemple de la sortie :


                   Cost of Euros in $ by date
                  .9       1.0       1.1       1.2       1.3
                  |         |         |         |         |
2003.01.02  1.036 +++++++++++++++
...
2003.08.28  1.087 ++++++++++++++++++++
2003.08.29  1.098 +++++++++++++++++++++
2003.08.31  1.099 +++++++++++++++++++++
2003.09.01  1.097 +++++++++++++++++++++
2003.09.02  1.081 +++++++++++++++++++
2003.09.04  1.094 ++++++++++++++++++++
2003.09.05  1.110 ++++++++++++++++++++++
2003.09.07  1.110 ++++++++++++++++++++++
2003.09.08  1.107 ++++++++++++++++++++++
2003.09.09  1.123 +++++++++++++++++++++++
2003.09.10  1.121 +++++++++++++++++++++++
2003.09.11  1.120 +++++++++++++++++++++++
2003.09.12  1.129 ++++++++++++++++++++++++
2003.09.14  1.127 ++++++++++++++++++++++++
2003.09.15  1.128 ++++++++++++++++++++++++
2003.09.16  1.117 +++++++++++++++++++++++
2003.09.17  1.129 ++++++++++++++++++++++++
2003.09.18  1.124 +++++++++++++++++++++++
2003.09.19  1.138 +++++++++++++++++++++++++

Maintenant, c'est au tour des experts de « sed ».

Phil Hughes est l'éditeur du Linux Journal, et donc de la Linux Gazette. Il rêve de télétravail en permanence depuis son domicile, sur la côte Pacifique de la péninsule Olympic (État de Washington). En tant qu'employeur, il est « implacable, démoniaque, mesquin et désagréable, mais empreint de bonhomie », comme tout patron devrait l'être.

Copyright © 2003, Phil Hughes.

Copying license http://www.linuxgazette.com/copying.html.

Paru dans le n°95 de la Linux Gazette d'octobre 2003.

Traduction française par Guillaume Lelarge .

Relecture de la traduction française par Joëlle Cornavin .