• Aucun résultat trouvé

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”.