TetaTricks/chap/scripting.tex

99 lines
3.3 KiB
TeX
Raw Normal View History

2022-04-01 23:23:45 +11:00
\chapter{scripting}
2023-10-09 06:56:41 +11:00
XXX
2022-04-01 23:23:45 +11:00
\section{Awk} \index{Awk}
2023-10-09 06:56:41 +11:00
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. }.
2024-09-16 12:21:41 +11:00
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.
2022-04-01 23:23:45 +11:00
Quelques \textsl{oneliners} de bon aloi pour vous donner
2024-09-16 12:21:41 +11:00
une idée des possibilités du langage\dots
2022-04-01 23:23:45 +11:00
\begin{verbatim}
2023-02-11 22:19:00 +11:00
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 }
2022-04-01 23:23:45 +11:00
\end{verbatim}
2023-02-11 22:19:00 +11:00
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 ».
2022-04-01 23:23:45 +11:00
% ===============================================================
\subsection{Un exemple simple}
À partir d'un jeu de données structurées, nous allons générer un
2024-09-16 12:21:41 +11:00
fichier \texttt{.inc} contenant la description en
SDL\index{SDL}\footnote{SDL: Scene Description Language}
d'un objet pour Povray\index{Povray}.
2023-02-11 22:19:00 +11:00
Un cas d'école : un élément par ligne, les valeurs sont séparées par
2024-09-16 12:21:41 +11:00
des espaces et/ou des tabulations.
2022-04-01 23:23:45 +11:00
\lstinputlisting[]{code/awk/dataset}
2023-02-11 22:19:00 +11:00
Ces données sont les coordonnées \textsc{x,y,z} et le rayon d'une
2022-04-01 23:23:45 +11:00
petite collection de bubulles. Pratiquement, une représentation
2024-09-16 12:21:41 +11:00
sommaire d'une sphère de povray\footnote{SDL keyword: \texttt{sphere}}.
2023-02-11 22:19:00 +11:00
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}
2024-09-16 12:21:41 +11:00
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}
2023-02-11 22:19:00 +11:00
% XXX to be continued XXX
2022-04-01 23:23:45 +11:00
% ===============================================================
2024-09-16 12:21:41 +11:00
\subsection{Définir une fonction}
% ===============================================================