[CLI Wiki] page changée : filtres:awk:presentation

noreply at asyd.net noreply at asyd.net
Wed Jun 30 14:28:16 CEST 2010


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/



More information about the Shell mailing list