Copyright © 2003 Phil Hughes
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».
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 :
La ligne « Rates as of » pour obtenir la date ;
La ligne « USD » pour obtenir le taux de conversion réel ;
La ligne « </PRE> » pour me faire afficher les informations et effacer mes variables. Notez que je n'ai pas réellement à les effacer si les données sont correctes, mais cela m'a semblé être un bon moyen de détecter les données erronées. Un « bidouillage » rapide, certes, mais pas un « bidouillage » rapide à tort et à travers.
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 <gleu CHEZ wanadoo POINT fr>.
Relecture de la traduction française par Joëlle Cornavin <jcornavi CHEZ club-internet POINT fr>.