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 [27/10/2013 17:27] smolski [Exercices] |
doc:programmation:awk [10/11/2013 23:32] kao [awk] Retrait Tags |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== awk ====== | ====== awk ====== | ||
- | (//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 part de vos remarques, succès, améliorations ou échecs ! | ||
* Objet : awk | * Objet : awk | ||
- | * Niveau requis : AVISÉ | + | * Niveau requis : {{tag>avisé}} |
* Commentaires : // Cet utilitaire a été créé dans le but de remplacer les commandes [[:doc:systeme:grep]] et [[:doc:systeme:sed]]. // | * Commentaires : // Cet utilitaire a été créé dans le but de remplacer les commandes [[:doc:systeme:grep]] et [[:doc:systeme:sed]]. // | ||
- | * Débutant, à savoir : | + | * Suivi : {{tag>}} |
- | [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) | + | * Débutant, à savoir : [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) |
* Création par **smolski** 18/10/2012) | * Création par **smolski** 18/10/2012) | ||
- | * Testé par **smolski** le 18/10/2012) | + | * Testé par **smolski** le 28/10/2013) |
+ | * Testé par **MicP** le 28/10/2013) | ||
* Commentaires sur le forum : [[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 !)) | * Commentaires sur le forum : [[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 !)) | ||
- | === Nota === | ||
- | |||
- | Contributeurs, les FIXME sont là pour vous aider, supprimez-les une fois le problème corrigé ou le champ rempli ! | ||
===== Introduction ===== | ===== Introduction ===== | ||
Ligne 25: | Ligne 21: | ||
===== Exercices ===== | ===== Exercices ===== | ||
- | Créez le fichier(([[:doc:systeme:touch]])) file.txt ainsi : | + | Créez((Vous pouvez faire cela avec votre éditeur de texte favori, voire avec [[:doc:systeme:cat]] ou simplement en téléchargeant la liste.)) le fichier ''file.txt'' contenant la liste suivante : |
- | <code user> | + | <code raw file.txt> |
- | touch file.txt</code> | + | |
- | + | ||
- | Et rédigez(([[:doc:systeme:cat]])) dedans cette liste ainsi : | + | |
- | <code user tp_awk1> | + | |
- | cat > file.txt <<EOF | + | |
Nom Genre Age | Nom Genre Age | ||
--------------------------------------- | --------------------------------------- | ||
Ligne 40: | Ligne 31: | ||
EMMA F 6 | EMMA F 6 | ||
THEO M 8 | THEO M 8 | ||
- | EOF</code> | + | </code> |
==== Extraire des colonnes ==== | ==== Extraire des colonnes ==== | ||
Ligne 57: | Ligne 48: | ||
THEO M</code> | THEO M</code> | ||
- | <note> | + | <note pip> |
* $1 correspond à la première colonne, $2 la seconde, $3 la troisième... | * $1 correspond à la première colonne, $2 la seconde, $3 la troisième... | ||
* $0 correspond à la ligne entière | * $0 correspond à la ligne entière | ||
Ligne 63: | Ligne 54: | ||
Dans le format de la sortie, les tabulations sont remplacées par un espace qui est le séparateur de sortie par défaut. | Dans le format de la sortie, les tabulations sont remplacées par un espace qui est le séparateur de sortie par défaut. | ||
- | <note important>Par défaut, les espaces et tabulations contigüs sont considérés comme un séparateur unique. Il s'agit de la seule exception.</note> | + | <note important>Par défaut, les espaces et tabulations contigües sont considérées comme un séparateur unique. Il s'agit de la seule exception.</note> |
==== Filtres et regexp ==== | ==== Filtres et regexp ==== | ||
+ | |||
+ | <note warning>**ATTENTION** ! Vérifiez toujours l'écriture de chaque script donné ici avant de l'appliquer ! \\ | ||
+ | Lien utile : **[[doc:programmation:shell:regexp | Les Regexp.]]** //Et c'est pas la peine de faire Ouch..! Tuto inévitable à ce niveau.// :-P</note> | ||
Précédemment, des colonnes ont été filtrées, mais awk est aussi principalement utilisé pour filtrer des lignes grâce aux syntaxes des expressions régulières. | Précédemment, des colonnes ont été filtrées, mais awk est aussi principalement utilisé pour filtrer des lignes grâce aux syntaxes des expressions régulières. | ||
Ligne 125: | Ligne 119: | ||
M,CAMILLE</code> | M,CAMILLE</code> | ||
- | <note>À noter le caractère ";" pour séparer les instructions dans la même ligne et la façon dont on assigne une valeur à une variable (OFS=",").</note> | + | <note tip>À noter le caractère ";" pour séparer les instructions dans la même ligne et la façon dont on assigne une valeur à une variable (OFS=",").</note> |
==== Scripts awk ==== | ==== Scripts awk ==== | ||
- | |||
- | <note warning>**ATTENTION** ! Vérifiez toujours l'écriture de chaque script donné ici avant de l'appliquer ! \\ | ||
- | Les exemples des scripts à copier avec **[[doc:systeme:cat | la commande cat]]** qui suivent nécessite le caractère d'échappement %%\%% devant le symbole $ afin que celui-ci soit écrit dans le script définitif __sans être interprété__ par la commande **cat** ! \\ | ||
- | Ces anti-slash ne sont pas nécessaires lorsque vous rédigez vos propres scripts manuellement. \\ | ||
- | Voir : **[[doc:programmation:shell:regexp#les_caracteres_echappes | Les Regexp.]]** //Et c'est pas la peine de faire Ouch..! Tuto inévitable à ce niveau.// :-P</note> | ||
awk a été utilisé précédemment en mode lignes de commande. Lorsque le programme awk devient complexe, ce dernier peut être stocké dans un fichier ''prog.awk'' comme ici : | awk a été utilisé précédemment en mode lignes de commande. Lorsque le programme awk devient complexe, ce dernier peut être stocké dans un fichier ''prog.awk'' comme ici : | ||
- | <code user prog.awk> | + | <code awk prog.awk> |
- | cat > prog.awk <<EOF | + | |
/^CL/,/^E/ { | /^CL/,/^E/ { | ||
- | print NR, \$0 | + | print NR, $0 |
} | } | ||
- | EOF</code> | + | </code> |
Puis interprété grâce à l'option -f : | Puis interprété grâce à l'option -f : | ||
Ligne 151: | Ligne 139: | ||
==== Pré et Post opérations ==== | ==== Pré et Post opérations ==== | ||
- | |||
- | <note warning>**ATTENTION** ! Vérifiez toujours l'écriture de chaque script donné ici avant de l'appliquer !</note> | ||
awk offre des sections pré-traitement (BEGIN) et post-traitement (END) lors de l'analyse d'un fichier. La structure du script awk est : | awk offre des sections pré-traitement (BEGIN) et post-traitement (END) lors de l'analyse d'un fichier. La structure du script awk est : | ||
- | <code user prog_awk> | + | <code awk prog.awk> |
- | cat > prog.awk <<EOF | + | |
/^CL/,/^E/ | /^CL/,/^E/ | ||
BEGIN { | BEGIN { | ||
Ligne 169: | Ligne 154: | ||
action | action | ||
} | } | ||
- | EOF</code> | + | </code> |
Donne : | Donne : | ||
Ligne 182: | Ligne 167: | ||
Des scripts bien plus complexes peuvent alors être écrits. Par exemple, extraire 2 colonnes en remplaçant les tabulations par des ";" et afficher le nombre de lignes à la fin : | Des scripts bien plus complexes peuvent alors être écrits. Par exemple, extraire 2 colonnes en remplaçant les tabulations par des ";" et afficher le nombre de lignes à la fin : | ||
- | <code user prog_awk> | + | <code awk prog.awk> |
- | cat > prog.awk <<EOF | + | |
BEGIN { | BEGIN { | ||
FS=" " | FS=" " | ||
Ligne 189: | Ligne 173: | ||
} | } | ||
{ | { | ||
- | print \$1, \$3 | + | print $1, $3 |
} | } | ||
END { | END { | ||
printf "\nThe file has %d lines\n", NR | printf "\nThe file has %d lines\n", NR | ||
} | } | ||
- | EOF</code> | + | </code> |
Ligne 211: | Ligne 195: | ||
The file has 8 lines </code> | The file has 8 lines </code> | ||
- | <note warning>**ATTENTION** ! Vérifiez toujours l'écriture de chaque script donné ici avant de l'appliquer !</note> | + | <note warning>**ATTENTION** ! Vérifiez toujours l'écriture de chaque script donné ici avant de l'appliquer ! //Bis.// :-P</note> |
Ligne 300: | Ligne 284: | ||
La possibilité de créer des fonctions utilisateur est une des fonctionnalités les plus importantes de l'utilitaire awk. Les fonctions sont définies avec le mot clé **function**. | La possibilité de créer des fonctions utilisateur est une des fonctionnalités les plus importantes de l'utilitaire awk. Les fonctions sont définies avec le mot clé **function**. | ||
- | <code user prog_awk> | + | <code awk prog.awk> |
- | cat > prog.awk <<EOF | + | |
function gentag(nom,age) { | function gentag(nom,age) { | ||
tmp=tolower(substr(nom,1,3)) | tmp=tolower(substr(nom,1,3)) | ||
Ligne 313: | Ligne 296: | ||
{ | { | ||
- | print \$1, \$3, gentag(\$1,\$3) | + | print $1, $3, gentag($1,$3) |
} | } | ||
Ligne 319: | Ligne 302: | ||
print NR , "lines" | print NR , "lines" | ||
} | } | ||
- | EOF | ||
</code> | </code> | ||
- | <code bash> | + | <code user> |
awk -f prog.awk file.txt</code> | awk -f prog.awk file.txt</code> | ||
<code> | <code> | ||
Ligne 342: | Ligne 324: | ||
Les enfants sont ils en primaire ou au collège avec if() {} else {} ? | Les enfants sont ils en primaire ou au collège avec if() {} else {} ? | ||
- | <code user prog_awk> | + | <code awk prog.awk> |
- | cat > prog.awk <<EOF | + | |
BEGIN { | BEGIN { | ||
OFS="," | OFS="," | ||
Ligne 349: | Ligne 330: | ||
NR <=2 { next } | NR <=2 { next } | ||
{ | { | ||
- | if ( \$3 < 11 ) { | + | if ( $3 < 11 ) { |
ecole="primaire" | ecole="primaire" | ||
} else { | } else { | ||
Ligne 355: | Ligne 336: | ||
} | } | ||
- | print \$1, ecole | + | print $1, ecole |
} | } | ||
- | EOF | ||
</code> | </code> | ||
Ligne 370: | Ligne 350: | ||
THEO,primaire</code> | THEO,primaire</code> | ||
- | Remarquer la façon dont l'entête est écartée : NR <=2 { next } | + | <note tip>Remarquer la façon dont l'entête est écartée : NR <=2 { next }</note> |
==== Boucles ==== | ==== Boucles ==== | ||
Remplacer l'âge de l'enfant par un nombre de points avec while() {}. | Remplacer l'âge de l'enfant par un nombre de points avec while() {}. | ||
- | <code user prog_awk> | + | <code awk prog.awk> |
- | cat > prog.awk <<EOF | + | |
NR <=2 { next } | NR <=2 { next } | ||
{ | { | ||
min=1 | min=1 | ||
- | printf "%-10s", \$1 | + | printf "%-10s", $1 |
- | while ( min <= \$3 ) { | + | while ( min <= $3 ) { |
printf "." | printf "." | ||
min++ | min++ | ||
Ligne 387: | Ligne 366: | ||
printf "\n" | printf "\n" | ||
} | } | ||
- | EOF | ||
</code> | </code> | ||
Ligne 403: | Ligne 381: | ||
Remplacer l'âge de l'enfant par un nombre de points avec for (i= ; i< ; i++ ) { }. | Remplacer l'âge de l'enfant par un nombre de points avec for (i= ; i< ; i++ ) { }. | ||
- | <code user prog_awk> | + | <code awk prog.awk> |
- | cat > prog.awk <<EOF | + | |
NR <=2 { next } | NR <=2 { next } | ||
{ | { | ||
- | printf "%-10s", \$1 | + | printf "%-10s", $1 |
- | for ( min=1 ; min <= \$3; min++ ) { | + | for ( min=1 ; min <= $3; min++ ) { |
printf "." | printf "." | ||
} | } | ||
printf "\n" | printf "\n" | ||
} | } | ||
- | EOF | ||
</code> | </code> | ||
Ligne 434: | Ligne 410: | ||
Calculer la moyenne d'âge des enfants par sexe : | Calculer la moyenne d'âge des enfants par sexe : | ||
- | <code user prog_awk> | + | <code awk prog.awk> |
- | cat > prog.awk <<EOF | + | |
{ | { | ||
if ( NR <= 2 ) { next } # skip first 2 lines | if ( NR <= 2 ) { next } # skip first 2 lines | ||
- | tab_age[\$2]+=\$3 | + | tab_age[$2]+=$3 |
- | tab_cpt[\$2]++ | + | tab_cpt[$2]++ |
} | } | ||
END { | END { | ||
Ligne 446: | Ligne 421: | ||
} | } | ||
} | } | ||
- | EOF | ||
</code> | </code> | ||
Ligne 455: | Ligne 429: | ||
M : Moy : 7 ans nb : 3</code> | M : Moy : 7 ans nb : 3</code> | ||
- | Remarquer comment les 2 tableaux sont remplis et traités à la fin. | + | <note tip>Remarquer comment les 2 tableaux sont remplis et traités à la fin.</note> |