\chapter{scripting} XXX \section{Awk} \index{Awk} Awk est un langage de programmation crée par Aho, Kernighan, and Weinberger% \footnote{The AWK Programming Language, Alfred V. Aho, Brian W. Kernighan, Peter J. Weinberger, Addison-Wesley, 1988. ISBN 0-201-07981-X. }. Son originalité vient du fait qu'il a été conçu principalement pour traiter ligne par ligne des fichiers tabulés. C'est son domaine de prédilection, autant en profiter. Quelques \textsl{oneliners} de bon aloi pour vous donner une idée des possibilités du langage\dots \begin{verbatim} cat { print $0 } or just 1 grep pattern /pattern/ head -n 5 NR <= 5 cut -f1 { print $1 } tr a-z A-Z { print toupper($0) } sed 's/hi/ho/g' gsub(/hi/,"ho") wc -l END { print NR } \end{verbatim} Vous pouvez déja constater une certaine élégance portée par une grande simplicité logique, une sorte d'axiome de base, de méthologie très \textsc{kiss} : on va procéder en quelque sorte « demi-dalle par demi-dalle ». % =============================================================== \subsection{Un exemple simple} À partir d'un jeu de données structurées, nous allons générer un fichier \texttt{.inc} contenant la description en SDL\index{SDL}\footnote{SDL: Scene Description Language} d'un objet pour Povray\index{Povray}. Un cas d'école : un élément par ligne, les valeurs sont séparées par des espaces et/ou des tabulations. \lstinputlisting[]{code/awk/dataset} Ces données sont les coordonnées \textsc{x,y,z} et le rayon d'une petite collection de bubulles. Pratiquement, une représentation sommaire d'une sphère de povray\footnote{SDL keyword: \texttt{sphere}}. Le fichier à générer est en trois partie : l'en-tête, la liste des bubulles\index{bubulle} et l'en-pied, ce qui est bien raccord avec la structure de déroulement d'un script Awk, comme nous allons le voir ici-même~: \lstinputlisting[]{code/awk/mkunion.awk} La première ligne est pour le traditionnel \textsl{shebang}\index{shebang}, avec l'option \texttt{-f} pour que le contenu du script soit lu par l'interpréteur Awk dès son lancement. Ensuite, nous trouvons trois blocs délimités par des accolades, deux d'entre eux étant précédés d'une « instruction ». Le premier bloc, avec le mot-clef \textsc{BEGIN}, est exécuté avant la lecture de la première ligne des données en entrée. Nous l'utilisons pour créer l'en-tête d'un descripteur d'objet pour Povray. Le second bloc (sans label) est exécuté pour chaque ligne lue. Et c'est ici que nous trouverons la magie. Et le troisième bloc (\textsc{END}) sera exécuté à la fin, après la lecture et le traitement du dernier enregistrement, qui sera dans notre cas la dernière ligne. Et à l'exécution~: \begin{verbatim} tth@redlady:~/Devel/TetaTricks/code/awk$ ./mkunion.awk < dataset #declare Bubules = object { union { sphere { <17.000000, 9.000000, 4.000000>, 1.500000 } sphere { <11.000000, 0.800000, 2.300000>, 0.989000 } sphere { <0.000000, 0.000000, 0.000000>, 1.000000 } } } \end{verbatim} % XXX to be continued XXX % =============================================================== \subsection{Définir une fonction} % ===============================================================