[CLI Wiki] page changée : filtres:awk:presentation
Une page dans votre Wiki a été ajoutée ou modifiée. Voici les détails : Date : 2009/04/19 15:28 Navigateur : Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.8) Gecko/2009032711 Ubuntu/8.10 (intrepid) Firefox/3.0.8 Adresse IP : 82.255.26.194 Nom d'hôte : lns-bzn-39-82-255-26-194.adsl.proxad.net Ancienne révision : http://cli.asyd.net/home/filtres/awk/presentation?rev=1240133598 Nouvelle révision : http://cli.asyd.net/home/filtres/awk/presentation Résumé : ajout d'exemple Utilisateur : christophemartin @@ -245,45 +245,100 @@ NB : On utilisera maintenant le terme ligne pour enregistrement et le terme colonne pour champ, car c'est ce qu'on fait le plus souvent. Ne perdez pas de vue cependant que cela peut être changé. + ===== Structure d'un script ===== - Un script en awk est une suite de paire : test action + Un script en awk est une suite de paire : ''test { action }'' - Pour chaque ligne, un test est effectue, et s'il réussit, l'action associée - est effectuée. Si l'action précédente n'a pas provoqué la fin du programme (exit) ou + Pour chaque ligne, un test est effectué, et s'il réussit, l'action associée + est exécutée. Si l'action précédente n'a pas provoqué la fin du programme (exit) ou le passage à une nouvelle ligne (next), le test suivant est évalué et son action associée est exécutée s'il a réussi, etc... * Ne pas mettre de test est considéré comme un test qui réussit toujours - * Ne pas mettre d'action provoque l'action par défaut si le test réussit : l affichage de la ligne. + * Ne pas mettre d'action provoque l'action par défaut si le test réussit : l'affichage de la ligne. * omettre un test et une action (faire un script vide) ne fait rien. - * le test BEGIN est vrai avant de commencer la lecture de quoi que ce soit on l'utilise pour initialiser. - * le test END est vrai après que la dernière ligne soit lue. on l'utilise habituellement pour générer des rapports, afficher des résultats lentement collectés au cours de la lecture... + * le test ''BEGIN'' est vrai avant de commencer la lecture de quoi que ce soit on l'utilise pour initialiser. on peut mettre plusieurs tests ''BEGIN'' dans un script, leurs actions seront toutes exécutées avant de commencer le traitement des données. + * le test ''END'' est vrai après que la dernière ligne soit lue. on l'utilise habituellement pour générer des rapports, afficher des résultats lentement collectés au cours de la lecture... On peut mettre plusieurs tests ''END'' dans un script, comme pour les tests ''BEGIN'' les actions seront toutes exécutées, sauf si l'une d'elles a recours à la commande ''exit'' de awk, bien sûr. Les tests peuvent être n'importe quelle expression qui s'évalue numériquement - ou "chainement" ou une expression rationnelle entre / - ou toute combinaison de tout cela grâce aux opérateurs et-logique, ou-logique etc... + ou "chainement" ou une expression rationnelle entre ''/'' + ou toute combinaison de tout cela grâce aux opérateurs et-logique (''&&''), ou-logique (''||'') etc... - * une expression numérique est "vraie" si elle est non nulle - * une expression chaine est "vraie" si elle est non vide - * une /expression rationnelle/ est "vraie" si elle concorde avec la ligne en cours de traitement + * une expression numérique est "vraie" si elle est non nulle, + * une expression chaine est "vraie" si elle est non vide, + * une /expression rationnelle/ est "vraie" si elle concorde avec la ligne en cours de traitement, ainsi les scripts suivants affichent toutes les lignes de leur entrée : <code awk> - nawk 1 - nawk '"a"' + awk 1 + awk '"a"' </code> et ceux là n'affichent rien : <code awk> - nawk 0 - nawk '""' + awk 0 + awk '""' + </code> + + Voilà quelques exemples de test possible et leur signification : + <code awk> + /toto/ { + print "la ligne\n\t" $0 "\ncontient 'toto'" + } + + $4 == "toto" { + print "dans\n\t", $0 "\nle 4eme mot est toto" + } + + $3 ~ /toto/ { + print "dans\n\t", $0 "\nle 3eme mot contient 'toto'" + } + + $3 ~ /^toto/ { + print "dans\n\t", $0, "\nle 3eme mot commence par 'toto'" + } + + NF > 1 && $(NF - 1) !~ /toto$/ { + print "dans\n\t", $0, "\nl avant dernier mot ne se termine PAS par 'toto'" + } + + NF > 4 && $(NF - 4) { + print "dans la ligne\n\t" $0 \ + "\nil y a au moins 5 colonnes", + "\nle quatrieme avant dernier mot est non nul (", $(NF - 4), ")" + } + + # Les chaines sont plus grandes que les nombres, donc + # ce test n est correct que si on est certain de ne rencontrer que des + # nombres dans les colonnes 3, 5, 7, 8 + /xyzzy/ || $5 > 3 && ( $3 < $5 || $7 >sin( 0.732 * $8 )) { + print "SURPRENEMENT, dans \n\t" $0 + print "\tsoit il y a 'xyzzy'" + print "\tsoit le nombre en colonne 5 est plus grand que 3 ET" + print "\t\tle nombre en colonne 3 est plus petit que le nombre en colonne 5" + print "\t\tou bien" + print "\t\tle nombre en colonne 7 est plus grand que sinus( 0,732 * le nombre en colonne 8 )" + } + + # On peut ruser un peu en multipliant chaque colonne par 1.0, car + # une chaine * un nombre = 0. Malgre tout, si seule la colonne 8 + # contient une chaine mais pas un nombre, ce test peut reussir tout + # de meme si les autres conditions sont remplies. + /xyzzy/ || $5 * 1.0 > 3 && ( $3 < $5 || $7 * 1.0 >sin( 0.732 * $8 )) { + print "PRESQUE CORRECTEMENT, dans \n\t" $0 + print "\tsoit il y a 'xyzzy'" + print "\tsoit le nombre en colonne 5 est plus grand que 3 ET" + print "\t\tle nombre en colonne 3 est plus petit que le nombre en colonne 5" + print "\t\tou bien" + print "\t\tle nombre en colonne 7 est plus grand que sinus( 0,732 * le nombre en colonne 8 )" + } </code> ===== La magie de awk ===== -- Ce message a été généré par DokuWiki http://cli.asyd.net/home/
participants (1)
-
noreply@asyd.net