[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 : 2010/06/30 14:28 Navigateur : Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.55 Safari/533.4 Adresse IP : 82.224.249.154 Nom d'hôte : toulouse.jfg-networks.net Ancienne révision : http://cli.asyd.net/home/filtres/awk/presentation?rev=1277891300 Nouvelle révision : http://cli.asyd.net/home/filtres/awk/presentation Résumé : Utilisateur : ker2x @@ -412,9 +412,9 @@ Et maintenant on va faire simple \o/ \\ Comment résoudre des problèmes du monde réel avec awk (gawk dans mon cas) plutôt qu'a coup de grep | sed | cut | sort | ... - ==== petit résumé === + ==== Petit résumé ==== * Un script awk se compose de 3 parties : * BEGIN { } : Ce qui sera fait avant de commencer a traiter le fichier donné. * Le corps du script @@ -430,11 +430,109 @@ * next : dit a awk de sauter a la ligne suivante sans s'occuper du reste. du corps du script. Y'a des milliards d'autres trucs mais on a déjà le plus utile rien qu'avec ca. - ** A suivre, j'suis au boulot et un truc viens de planter \o/ ** + ==== De la pratique ==== + + Prenons un fichier dont les champs sont séparés par des ";" et les lignes par des "\n", les lignes commencants par "#" sont ignorées. + + <code> + #ceci est un commentaire + 1;plop;coin + 42;quatre;deux + #mince, encore un commentaire + 12;foo;bar + etc ... + </code> + + * Première étape : travailler dans un script. Les oneliners c'est pour les barbares et les perlistes. + * 2ème étape : définir certaines de nos variables dans BEGIN {} + + <code awk> + #!/usr/bin/awk -f + + BEGIN { + FS=";" + RS="\n" + } + </code> + + * 3ème étape : ignorer les commentaires + + <code awk> + /^#/ { next } + </code> + + * maintenant il faut être un peu fun, et n'afficher par exemple que les lignes dont le 2ème et 3ème champs sont identiques. + * en fait c'est surtout manière d'introduire la notion de fonction :) + + <code awk> + function are_equal(a,b) { return (a == b) } + </code> + + * Une fois qu'on a cette fonction écrite ce qui est presque trop facile, on n'a plus qu'a écrire la ligne awk qui va bien, qui est elle aussi presque trop facile... + + <code awk> + { + if(are_equal($2,$3)) { + print $0 + } + } + </code> + + Bon bon bon, je suis désolé mais c'est encore beaucoup trop facile. + + === Un exemple complet, utile et facile === + + On reprend le même fichier qu'au dessus, et on veut afficher et compter le nombre de ligne dont le champ 2 et 3 sont égaux (tout en ignorant les lisgnes #commentées. \\ + Il se passe de discours, j'espère. + + <code awk> + #!/usr/bin/awk -f + + BEGIN { + FS=";" + RS="\n" + mon_total = 0 + } + + /^#/ { next } + + { + if(are_equal($2,$3)) { + print $0 + mon_total++ + } + } + + function are_equal(a,b) { return (a == b) } + + END { + print "mon total : " mon_total + print "petit bonus, pourcentage de ligne avec les 2 champs egaux : " mon_total/NR*100 "%" + } + </code> + + Trop facile \o/ presque ... il y a une petite subtilité : NR compte le nombre de ligne du fichier, commentaire ou pas. si on veut compter que les commentaire il faut rajouter un 2eme compteur (a initialiser dans BEGIN) et a incrementer pour chaque ligne qui ne sont pas un commentaire. \\ + + Bah, il faudrait faire un truc du genre : + + <code awk> + { + if(are_equal($2,$3)) { + print $0 + mon_total++ + } + nocomment_total++ + } + </code> + + et faire un mon_total/nocomment_total*100 + + + ** A suivre, ... ** ====== Historique du document ====== * Première version de Christophe Martin (10 Mars 2006) * Christophe Martin : Correction d'orthographe et ajout d'exemples commentés (19 avril 2009) * Awk facile dans le monde réel : Laurent "ker2x" Laborde (Juin-Juillet 2010) -- Ce message a été généré par DokuWiki http://cli.asyd.net/home/
participants (1)
-
noreply@asyd.net