Une page dans votre Wiki a été ajoutée ou modifiée. Voici les
détails :
Date : 2010/06/30 14:30
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=1277900895
Nouvelle révision : http://cli.asyd.net/home/filtres/awk/presentation
Résumé :
Utilisateur : ker2x
@@ -511,9 +511,9 @@
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. \\
+ Trop facile \o/ presque ... il y a une petite subtilité : NR compte le nombre de ligne du fichier, commentaire ou pas. si on veut un pourcentage qui ne tiens pas compte des 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>
--
Ce message a été généré par DokuWiki
http://cli.asyd.net/home/
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/
Une page dans votre Wiki a été ajoutée ou modifiée. Voici les
détails :
Date : 2010/06/30 11:48
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=1277891236
Nouvelle révision : http://cli.asyd.net/home/filtres/awk/presentation
Résumé :
Utilisateur : ker2x
@@ -431,10 +431,10 @@
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/ **
-
====== 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/
Une page dans votre Wiki a été ajoutée ou modifiée. Voici les
détails :
Date : 2010/06/30 11:47
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=1277891102
Nouvelle révision : http://cli.asyd.net/home/filtres/awk/presentation
Résumé :
Utilisateur : ker2x
@@ -410,9 +410,9 @@
====== Awk facile dans le monde réel ======
Et maintenant on va faire simple \o/ \\
- Comment résoudre des problème du monde réel avec awk (gawk dans mon cas) plutot qu'a coup de grep | sed | cut | sort | ...
+ 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é ===
* Un script awk se compose de 3 parties :
--
Ce message a été généré par DokuWiki
http://cli.asyd.net/home/
Une page dans votre Wiki a été ajoutée ou modifiée. Voici les
détails :
Date : 2010/06/30 11:45
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=1277888864
Nouvelle révision : http://cli.asyd.net/home/filtres/awk/presentation
Résumé :
Utilisateur : ker2x
@@ -409,9 +409,9 @@
</code>
====== Awk facile dans le monde réel ======
- Et maintenant on va faire simple \o/
+ Et maintenant on va faire simple \o/ \\
Comment résoudre des problème du monde réel avec awk (gawk dans mon cas) plutot qu'a coup de grep | sed | cut | sort | ...
==== petit résumé ===
--
Ce message a été généré par DokuWiki
http://cli.asyd.net/home/
Une page dans votre Wiki a été ajoutée ou modifiée. Voici les
détails :
Date : 2010/06/30 11:07
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=1240148515
Nouvelle révision : http://cli.asyd.net/home/filtres/awk/presentation
Résumé :
Utilisateur : ker2x
@@ -407,10 +407,34 @@
}
' /var/mail/$USER
</code>
+ ====== Awk facile dans le monde réel ======
+
+ Et maintenant on va faire simple \o/
+ Comment résoudre des problème du monde réel avec awk (gawk dans mon cas) plutot qu'a coup de grep | sed | cut | sort | ...
+
+ ==== 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
+ * END { } : Ce qui sera fait après avoir traité la totalité du fichier
+
+ * Mots clés et variables utiles :
+ * FS (field separator) : Definit le separateur de champs. ex : BEGIN { FS="\t" } pour dire qu'on travaille sur un fichier tabulé. A ma connaissance, aucune implémentation n'accepte de regexp comme séparateur de champs.
+ * RS (record separator) : Definit le separateur de ligne. (pareil, on le met dans le BEGIN { })
+ * NR : Nombre de champs dans la ligne courante
+ * NF : Dernier champs d'une ligne. ex : print $NF affiche le dernier champs. Utile aussi dans les boucles for : for (i=1 ; i<=NF ; i++)
+ * $0 : print $0 pour afficher toute la ligne
+ * $1, $2, $n : premier champ, 2ème champ, nième champ.
+ * 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/ **
====== 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)
--
Ce message a été généré par DokuWiki
http://cli.asyd.net/home/