Les actions sont des blocs constituant une requ^ete "awk". Ils d´ecrivent les op´erations `a effectuer lorsque la s´election d´ecrite en t^ete de
requ^ete est v´erifi´ee. Les gens connaissant le langage C retrouveront la plupart des fonctions standards avec des syntaxes identiques. On trouvera aussi un ensemble de fonctions sp´ecifiques.
Les op´erateurs arithm´etiques autoris´es dans ces blocs sont explicit´es dans le tableau suivant :
Op´erateur Description
= affectation
+ addition binaire
++ incr´ementation de 1
+= addition unaire
La concat´enation de champs se fait sans op´erateur sp´ecifique. Il suffit de lister les cha^ınes `a concat´ener.
Exemple 16.4 :
cumul ++ identique `a "cumul = cumul + 1"
cumul += $2 identique `a "cumul = cumul + $2"
cumul = cumul - $2 ht = ttc - tva
cumul -- identique `a "cumul = cumul - 1"
cumul -= $2 identique `a "cumul = cumul - $2"
16.4. Les actions
16.4.1 Les fonctions pr´ ed´ efinies
La liste des fonctions suivantes n’est pas exhaustive. Elle donne celles qui sont usuellement utilis´ees. Les tableaux explicitent ces fonctions. Le tableau 16.4 donne une liste de fonctions acceptant un argument de type num´erique, le tableau 16.5 donne une liste de fonctions acceptant un argument de type "cha^ıne de caract`eres".
Fonction Description
sqrt(arg) renvoie la racine carr´e de l’argument.
log(arg) renvoie le logarithme n´ep´erien de l’argument.
exp(arg) renvoie l’exponentiel de l’argument.
int(arg) renvoie la partie enti`ere3de l’argument..
Tab.16.4 – Fonctions acceptant un argument de type num´erique.
Fonction Description
length4 renvoie la longueur de l’enregistrement courant.
length(arg) renvoie la longueur de la chaine pass´ee en argument.
substr(arg,m[,n]) renvoie la sous chaˆıne de la chaine ”arg” commen¸cant
`
a la position ”m” et de longueur ”n”. Le premier ca-ract`ere est `a la position ”1”5. Si ”n” n’est pas sp´ecifi´e, la fonction ”substr” renvoie la fin de l’argument `a partir de la position ”m”.
index(str1,str2) renvoie la position de ”str2” dans la chaˆıne ”str1”.
Si ”str1” ne contient pas la chaˆıne ”str2”, ”index”
renvoie ”0”6.
print [arg1[,arg2],· · ·] [> dest] affiche les arguments ”arg1”, ”arg1”,· · ·sur la sortie standard sans les formater. Avec l’option ”> dest”, l’affichage est redirig´e sur le fichier ”dest” au lieu de la sortie standard.
printf(format,arg1,arg2,· · ·) [> dest] affiche les argumentsarg1,arg2,· · ·sur la sortie stan-dard apr`es les avoir format´es `a l’aide de la chaˆıne de contrˆole ”format”. Avec l’option ”> dest”, l’af-fichage est redirig´e sur le fichier ”dest” au lieu de la sortie standard.
sprintf(format,arg1,arg2,· · ·) renvoie une chaˆıne de caract`eres format´ee int´egrant arg1,arg2,· · ·correspondant aux instruction de for-mattage en fonction de la chaˆıne de contrˆole ”for-mat”.Attention, cette fonction a un comportement diff´erent de celui de la fonction ”sprintf(3)”.
Tab.16.5 – Fonctions acceptant des arguments de type alphanum´erique.
Remarque 16.1 :
Pour plus de pr´ecisions sur les instructions de formattage, reportez-vous `a l’annexe A.
Exemple 16.5 :
Exemple d’utilisation des fonctions pr´ed´efinies :
S.Baudry, Introduction `a la programmation Bourne Shell – v4.0 141
Chapitre 16. Utilisation de ”awk”
if (length > 80 ) {
print "la ligne no: ", NR, " du fichier ",FILENAME, \
"est trop longue"
modulo = int(cumul/100) * 100
codepostal = substr("75006 Paris",1,5)
pos = index("75006 Paris","Paris") renvoie 7 print $1,$2,cumul
print "resultats", cumul > /tmp/result.tmp print "cumuls", $1+$2 > $3
nom = sprintf ("%10.10s %10.10s .", nom, prenom)
16.4.2 Les fonctions utilisateur
En plus des fonctions pr´ed´efinies, l’utilisateur peut d´efinir ses propres fonctions. Ces fonctions peuvent se trouver n’importe o`u dans le corps du programme "awk". La d´eclaration d’une fonction se fait de la fa¸con suivante :
function nom_fonction (arguments) {
instructions }
La fonction peut ^etre appel´ee dans n’importe quel bloc action d’une requ^ete "awk". Il suffit de la r´ef´erencer par son nom. Les fonctions utilisateurs peuvent ^etre r´ecursives.
Exemple 16.6 :
function factoriel (num) {
if (num == 0) return 1
return (num * factoriel(num - 1)) }
$1 ~ /^Factoriel$/ { print factoriel($2) }
$1 ~ /^Minimum$/ { print minimum ($2, $3) } function minimum (n,m) {
return (m < n ? m : n) }
16.4.3 Les structures de contrˆ ole
L’ensemble des structures de contr^ole de "awk" fonctionnent comme celles du langage C. Nous allons donc ne faire qu’un bref rappel sur
16.4. Les actions
la syntaxe des diff´erentes structures de contr^oles disponibles.
Dans toute la suite de ce paragraphe, le terme instruction d´esigne un ensemble d’instructions "awk" s´epar´ees par le caract`ere " ;" ou "return
"et encadr´ees par des "{","}".
Structure de contr^ole "if, else" : if (condition)
instruction else
instruction
Structure de contr^ole "while" : while (condition)
instruction
Structure de contr^ole "for" :
for (init;condition;it{\’e}ration) instruction
Instruction "break" :
L’instruction "break" provoque la sortie du niveau courant d’une boucle "while" ou "for".
Instruction "continue" :
L’instruction "continue" provoque l’it´eration suivante au niveau courant d’une boucle "while" ou "for".
Instruction "next" : L’instruction "next" force "awk" `a passer `a la ligne suivante du fichier en entr´ee.
Instruction "exit" :
L’instruction "exit" force "awk" `a interrompre la lecture du fichier d’entr´ee comme si la fin avait ´et´e atteinte.
Exemple 16.7 :
if ($3 == foo*5) { a = $6 % 2;
print $5, $6, "total", a;
b = 0;
S.Baudry, Introduction `a la programmation Bourne Shell – v4.0 143
Chapitre 16. Utilisation de ”awk”
Remarque 16.2 :
Ces structures de contrˆoles et les instructions qui y sont li´ees , bien que leur nom soit identique `a celui utilis´e pour les structures du shell sont diff´erentes en de multiples points :
– tout d’abord, leur syntaxe est diff´erente,
– les structures de contrˆoles pour ”awk” s’ex´ecutent dans le proces-sus li´e `a cet utilitaire,
– les structures de contrˆoles du shell sont ex´ecut´ees dans le processus li´e au script ou bien `a l’interpr´eteur de commandes actif.
Par cons´equent, l’utilisation d’un ”if” peut ˆetre li´e au shell ou bien `a un utilitaire comme ”awk”.