Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format
PDF et la grise au format ODT →
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révision Les deux révisions suivantes | ||
doc:programmation:awk [18/10/2012 13:23] smolski |
doc:programmation:awk [22/09/2013 23:31] 127.0.0.1 modification externe |
||
---|---|---|---|
Ligne 2: | Ligne 2: | ||
(//testé// - **smolski** 18/10/2012) Le retour sur le forum est ici : | (//testé// - **smolski** 18/10/2012) Le retour sur le forum est ici : | ||
- | * [[http://debian-facile.org/viewtopic.php?id=6057 | Lien vers le forum concernant ce tuto]] N'hésitez pas à y faire par de vos remarques, succès, améliorations ou échecs ! | + | * [[http://debian-facile.org/viewtopic.php?id=6057 | Lien vers le forum concernant ce tuto]] N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs ! |
* Objet : awk | * Objet : awk | ||
* Niveau requis : AVISÉ | * Niveau requis : AVISÉ | ||
- | * Commentaires : // Cet utilitaire a été créé dans le but de remplacer les commandes [[commande:grep]] et [[commande:sed]]. // | + | * Commentaires : // Cet utilitaire a été créé dans le but de remplacer les commandes [[:doc:systeme:grep]] et [[:doc:systeme:sed]]. // |
* Débutant, à savoir : | * Débutant, à savoir : | ||
- | [[manuel:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) | + | [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) |
===== Introduction ===== | ===== Introduction ===== | ||
Ligne 18: | Ligne 18: | ||
===== Exercices ===== | ===== Exercices ===== | ||
- | Créez le fichier(([[commande:touch]])) file.txt ainsi : | + | Créez le fichier(([[:doc:systeme:touch]])) file.txt ainsi : |
<code bash> | <code bash> | ||
touch file.txt</code> | touch file.txt</code> | ||
- | Et rédigez(([[commande:cat]])) dedans cette liste ainsi : | + | Et rédigez(([[:doc:systeme:cat]])) dedans cette liste ainsi : |
<code bash> | <code bash> | ||
cat > file.txt <<EOS | cat > file.txt <<EOS | ||
Ligne 310: | Ligne 310: | ||
print NR , "lines" | print NR , "lines" | ||
} | } | ||
+ | EOS | ||
</code> | </code> | ||
<code bash> | <code bash> | ||
- | awk -f prog.awk file.txt | + | awk -f prog.awk file.txt</code> |
- | EOS | + | |
<code> | <code> | ||
Nom;Age;nom_Age | Nom;Age;nom_Age | ||
Ligne 325: | Ligne 326: | ||
THEO;8;the_8 | THEO;8;the_8 | ||
8;lines</code> | 8;lines</code> | ||
+ | |||
+ | ===== Programmation ===== | ||
+ | |||
+ | Le parseur awk offre toutes les structures de programmation : conditions, boucles, itérations. | ||
+ | |||
+ | ==== Condition ==== | ||
+ | |||
+ | Les enfants sont ils en primaire ou au collège avec if() {} else {} ? | ||
+ | <code bash> | ||
+ | cat prog.awk <<EOS | ||
+ | BEGIN { | ||
+ | OFS="," | ||
+ | } | ||
+ | NR <=2 { next } | ||
+ | { | ||
+ | if ( \$3 < 11 ) { | ||
+ | ecole="primaire" | ||
+ | } else { | ||
+ | ecole="college" | ||
+ | } | ||
+ | |||
+ | print \$1, ecole | ||
+ | } | ||
+ | EOS </code> | ||
+ | <code bash> | ||
+ | nawk -f prog.awk file.txt</code> | ||
+ | <code> | ||
+ | CAMILLE,primaire | ||
+ | CHLOE,college | ||
+ | CLARA,college | ||
+ | CLEMENT,primaire | ||
+ | EMMA,primaire | ||
+ | THEO,primaire</code> | ||
+ | |||
+ | Remarquer la façon dont l'entête est écartée : NR <=2 { next } | ||
+ | |||
+ | ==== Boucles ==== | ||
+ | |||
+ | Remplacer l'âge de l'enfant par un nombre de points avec while() {}. | ||
+ | <code bash> | ||
+ | cat > prog.awk | ||
+ | NR <=2 { next } | ||
+ | { | ||
+ | min=1 | ||
+ | printf "%-10s", \$1 | ||
+ | while ( min <= \$3 ) { | ||
+ | printf "." | ||
+ | min++ | ||
+ | } | ||
+ | printf "\n" | ||
+ | } | ||
+ | <code bash> | ||
+ | awk -f prog.awk file.txt</code> | ||
+ | <code> | ||
+ | CAMILLE ....... | ||
+ | CHLOE ............ | ||
+ | CLARA ........... | ||
+ | CLEMENT ....... | ||
+ | EMMA ...... | ||
+ | THEO ........</code> | ||
+ | |||
+ | ==== Itérations ==== | ||
+ | |||
+ | Remplacer l'âge de l'enfant par un nombre de points avec for (i= ; i< ; i++ ) { }. | ||
+ | <code bash> | ||
+ | cat > prog.awk <<EOS | ||
+ | NR <=2 { next } | ||
+ | { | ||
+ | printf "%-10s", \$1 | ||
+ | for ( min=1 ; min <= \$3; min++ ) { | ||
+ | printf "." | ||
+ | } | ||
+ | printf "\n" | ||
+ | }EOS | ||
+ | </code> | ||
+ | |||
+ | <code bash> | ||
+ | awk -f prog.awk file.txt</code> | ||
+ | <code> | ||
+ | CAMILLE ....... | ||
+ | CHLOE ............ | ||
+ | CLARA ........... | ||
+ | CLEMENT ....... | ||
+ | EMMA ...... | ||
+ | THEO ........</code> | ||
+ | |||
+ | ==== Tableaux (Arrays) ==== | ||
+ | |||
+ | Pour terminer cette brève présentation : les tableaux avec awk, particulièrement pratiques pour calculer des agrégats. \\ | ||
+ | La structure d'un tableau avec awk est très simple : | ||
+ | |||
+ | tab[indice] = value | ||
+ | |||
+ | Calculer la moyenne d'âge des enfants par sexe : | ||
+ | <code bash> | ||
+ | cat < prog.awk <<EOS | ||
+ | { | ||
+ | if ( NR <= 2 ) { next } # skip first 2 lines | ||
+ | tab_age[$2]+=$3 | ||
+ | tab_cpt[$2]++ | ||
+ | } | ||
+ | END { | ||
+ | for ( genre in tab_age ) { | ||
+ | print genre, " : ", "Moy :", int(tab_age[genre]/tab_cpt[genre]), "ans", "nb :", tab_cpt[genre] | ||
+ | } | ||
+ | }EOS | ||
+ | </code> | ||
+ | |||
+ | <code bash> | ||
+ | awk -f prog.awk file.txt</code> | ||
+ | <code> | ||
+ | F : Moy : 9 ans nb : 3 | ||
+ | M : Moy : 7 ans nb : 3</code> | ||
+ | |||
+ | Remarquer comment les 2 tableaux sont remplis et traités à la fin. | ||
+ | ===== Lien ===== | ||
+ | Un lieu formidable là : | ||
+ | * [[http://www.sqlpac.com/articles/unix-linux/outils | Outil Linux - **SQLPAC** SQL Pour Administrateurs & Concepteurs]] | ||
- | //À suivre...// **Jojo** ;-) |