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 16:16] smolski [Programmation] |
doc:programmation:awk [27/10/2013 18:18] smolski [Programmation] |
||
---|---|---|---|
Ligne 25: | Ligne 25: | ||
===== 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 <<EOS | + | |
Nom Genre Age | Nom Genre Age | ||
--------------------------------------- | --------------------------------------- | ||
Ligne 40: | Ligne 35: | ||
EMMA F 6 | EMMA F 6 | ||
THEO M 8 | THEO M 8 | ||
- | EOS</code> | + | </code> |
==== Extraire des colonnes ==== | ==== Extraire des colonnes ==== | ||
Ligne 46: | Ligne 41: | ||
Extraire des données d'un fichier, par exemple les 2 premières colonnes : | Extraire des données d'un fichier, par exemple les 2 premières colonnes : | ||
<code user> | <code user> | ||
- | awk '{ print $1, $2 }' file.txt | + | awk '{ print $1, $2 }' file.txt</code> |
+ | <code> | ||
Nom Genre | Nom Genre | ||
--------------------------------------- | --------------------------------------- | ||
Ligne 71: | Ligne 66: | ||
Retrouver les lignes qui contiennent CAMILLE : | Retrouver les lignes qui contiennent CAMILLE : | ||
<code user> | <code user> | ||
- | awk '/CAMILLE/ { print $1, $3, $2 }' file.txt | + | awk '/CAMILLE/ { print $1, $3, $2 }' file.txt</code> |
+ | <code> | ||
CAMILLE 7 M</code> | CAMILLE 7 M</code> | ||
Ligne 80: | Ligne 75: | ||
Un autre filtre plus complexe, rechercher les lignes qui commencent par C et qui contiennent la lettre A ou la lettre O : | Un autre filtre plus complexe, rechercher les lignes qui commencent par C et qui contiennent la lettre A ou la lettre O : | ||
<code user> | <code user> | ||
- | awk '/^C.*[AO]/ { print $1, $3, $2 }' file.txt | + | awk '/^C.*[AO]/ { print $1, $3, $2 }' file.txt</code> |
+ | <code> | ||
CAMILLE 7 M | CAMILLE 7 M | ||
CHLOE 12 F | CHLOE 12 F | ||
Ligne 89: | Ligne 84: | ||
Pour récupérer les lignes de CL à E, tapez : | Pour récupérer les lignes de CL à E, tapez : | ||
<code user> | <code user> | ||
- | awk '/^CL/,/^E/ { print $0 }' file.txt | + | awk '/^CL/,/^E/ { print $0 }' file.txt</code> |
+ | <code> | ||
CLARA F 11 | CLARA F 11 | ||
CLEMENT M 7 | CLEMENT M 7 | ||
Ligne 105: | Ligne 100: | ||
<code user> | <code user> | ||
- | awk '{ print NR, NF, $0 }' file.txt | + | awk '{ print NR, NF, $0 }' file.txt</code> |
+ | <code> | ||
1 3 Nom Genre Age | 1 3 Nom Genre Age | ||
2 1 --------------------------------------- | 2 1 --------------------------------------- | ||
Ligne 121: | Ligne 116: | ||
* OFS : Séparateur de champ en sortie (par défaut : espace). | * OFS : Séparateur de champ en sortie (par défaut : espace). | ||
<code user> | <code user> | ||
- | awk '/CAMILLE/ { OFS="," ; print $2,$1 }' file.txt | + | awk '/CAMILLE/ { OFS="," ; print $2,$1 }' file.txt</code> |
+ | <code> | ||
M,CAMILLE</code> | M,CAMILLE</code> | ||
Ligne 129: | Ligne 124: | ||
==== Scripts awk ==== | ==== Scripts awk ==== | ||
- | <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 ! \\ |
+ | 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 <<EOS | + | |
/^CL/,/^E/ { | /^CL/,/^E/ { | ||
print NR, \$0 | print NR, \$0 | ||
} | } | ||
- | EOS</code> | + | </code> |
Puis interprété grâce à l'option -f : | Puis interprété grâce à l'option -f : | ||
<code user> | <code user> | ||
- | awk -f prog.awk file.txt | + | awk -f prog.awk file.txt</code> |
+ | <code> | ||
5 CLARA F 11 | 5 CLARA F 11 | ||
6 CLEMENT M 7 | 6 CLEMENT M 7 | ||
Ligne 152: | Ligne 147: | ||
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 <<EOS | + | |
/^CL/,/^E/ | /^CL/,/^E/ | ||
BEGIN { | BEGIN { | ||
Ligne 166: | Ligne 160: | ||
action | action | ||
} | } | ||
- | EOS</code> | + | </code> |
Donne : | Donne : | ||
<code user> | <code user> | ||
- | awk -f prog.awk file.txt | + | awk -f prog.awk file.txt</code> |
+ | <code> | ||
CLARA F 11 | CLARA F 11 | ||
CLEMENT M 7 | CLEMENT M 7 | ||
Ligne 179: | Ligne 173: | ||
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 <<EOS | + | |
BEGIN { | BEGIN { | ||
FS=" " | FS=" " | ||
Ligne 186: | Ligne 179: | ||
} | } | ||
{ | { | ||
- | print \$1, \$3 | + | print $1, $3 |
} | } | ||
END { | END { | ||
printf "\nThe file has %d lines\n", NR | printf "\nThe file has %d lines\n", NR | ||
} | } | ||
- | EOS</code> | + | </code> |
<code user> | <code user> | ||
- | awk -f prog.awk file.txt | + | awk -f prog.awk file.txt</code> |
+ | <code> | ||
Nom;Age | Nom;Age | ||
---------------------------------------; | ---------------------------------------; | ||
Ligne 220: | Ligne 213: | ||
Convertir du texte en majuscules ou en minuscules avec les fonctions toupper et tolower | Convertir du texte en majuscules ou en minuscules avec les fonctions toupper et tolower | ||
<code user> | <code user> | ||
- | awk '/THEO/ { print $1, tolower($1) }' file.txt | + | awk '/THEO/ { print $1, tolower($1) }' file.txt</code> |
+ | <code> | ||
THEO theo</code> | THEO theo</code> | ||
Ligne 228: | Ligne 221: | ||
Convertir une valeur en entier avec la fonction **int** : | Convertir une valeur en entier avec la fonction **int** : | ||
<code user> | <code user> | ||
- | awk '/CHLOE/ { print $3, int($3/5)}' file.txt | + | awk '/CHLOE/ { print $3, int($3/5)}' file.txt</code> |
+ | <code> | ||
12 2</code> | 12 2</code> | ||
Ligne 249: | Ligne 242: | ||
Afficher la taille d'une chaîne de caractères avec la fonction length : | Afficher la taille d'une chaîne de caractères avec la fonction length : | ||
<code user> | <code user> | ||
- | awk '/CLEM/ { print $1, length($1) }' file.txt | + | awk '/CLEM/ { print $1, length($1) }' file.txt</code> |
+ | <code> | ||
CLEMENT 7</code> | CLEMENT 7</code> | ||
Ligne 257: | Ligne 250: | ||
Retourne la position d'une chaîne de caractères remplissant les critères d'une expression régulière avec la fonction match : | Retourne la position d'une chaîne de caractères remplissant les critères d'une expression régulière avec la fonction match : | ||
<code user> | <code user> | ||
- | awk 'NR >2 { print $1, match($1,"A")}' file.txt | + | awk 'NR >2 { print $1, match($1,"A")}' file.txt</code> |
+ | <code> | ||
CAMILLE 2 | CAMILLE 2 | ||
CHLOE 0 | CHLOE 0 | ||
Ligne 270: | Ligne 263: | ||
Remplacer des chaînes de caractères avec la fonction gsub : | Remplacer des chaînes de caractères avec la fonction gsub : | ||
<code user> | <code user> | ||
- | awk 'NR >2 { gsub("A","_",$1) ; print $1 }' file.txt | + | awk 'NR >2 { gsub("A","_",$1) ; print $1 }' file.txt</code> |
+ | <code> | ||
C_MILLE | C_MILLE | ||
CHLOE | CHLOE | ||
Ligne 283: | Ligne 276: | ||
Extraire une portion de texte avec la fonction substr : | Extraire une portion de texte avec la fonction substr : | ||
<code user> | <code user> | ||
- | awk '{ print $1, substr($1,2,3) }' file.txt | + | awk '{ print $1, substr($1,2,3) }' file.txt</code> |
+ | <code> | ||
Nom om | Nom om | ||
--------------------------------------- --- | --------------------------------------- --- | ||
Ligne 297: | Ligne 290: | ||
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 <<EOS | + | |
function gentag(nom,age) { | function gentag(nom,age) { | ||
tmp=tolower(substr(nom,1,3)) | tmp=tolower(substr(nom,1,3)) | ||
Ligne 310: | Ligne 302: | ||
{ | { | ||
- | print \$1, \$3, gentag(\$1,\$3) | + | print $1, $3, gentag($1,$3) |
} | } | ||
Ligne 316: | Ligne 308: | ||
print NR , "lines" | print NR , "lines" | ||
} | } | ||
- | EOS | ||
</code> | </code> | ||
- | <code bash> | + | <code user> |
- | awk -f prog.awk file.txt | + | awk -f prog.awk file.txt</code> |
+ | <code> | ||
Nom;Age;nom_Age | Nom;Age;nom_Age | ||
---------------------------------------;;---_ | ---------------------------------------;;---_ | ||
Ligne 339: | Ligne 330: | ||
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 <<EOS | + | |
BEGIN { | BEGIN { | ||
OFS="," | OFS="," | ||
Ligne 346: | Ligne 336: | ||
NR <=2 { next } | NR <=2 { next } | ||
{ | { | ||
- | if ( \$3 < 11 ) { | + | if ( $3 < 11 ) { |
ecole="primaire" | ecole="primaire" | ||
} else { | } else { | ||
Ligne 352: | Ligne 342: | ||
} | } | ||
- | print \$1, ecole | + | print $1, ecole |
} | } | ||
- | EOS | ||
</code> | </code> | ||
<code user> | <code user> | ||
- | awk -f prog.awk file.txt | + | awk -f prog.awk file.txt</code> |
+ | <code> | ||
CAMILLE,primaire | CAMILLE,primaire | ||
CHLOE,college | CHLOE,college | ||
Ligne 367: | Ligne 356: | ||
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 <<EOS | + | |
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 384: | Ligne 372: | ||
printf "\n" | printf "\n" | ||
} | } | ||
- | EOS | ||
</code> | </code> | ||
<code user> | <code user> | ||
- | awk -f prog.awk file.txt | + | awk -f prog.awk file.txt</code> |
+ | <code> | ||
CAMILLE ....... | CAMILLE ....... | ||
CHLOE ............ | CHLOE ............ | ||
Ligne 400: | Ligne 387: | ||
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 <<EOS | + | |
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" | ||
} | } | ||
- | EOS | ||
</code> | </code> | ||
<code user> | <code user> | ||
- | awk -f prog.awk file.txt | + | awk -f prog.awk file.txt</code> |
+ | <code> | ||
CAMILLE ....... | CAMILLE ....... | ||
CHLOE ............ | CHLOE ............ | ||
Ligne 431: | Ligne 416: | ||
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 <<EOS | + | |
{ | { | ||
if ( NR <= 2 ) { next } # skip first 2 lines | if ( NR <= 2 ) { next } # skip first 2 lines | ||
Ligne 443: | Ligne 427: | ||
} | } | ||
} | } | ||
- | EOS | ||
</code> | </code> | ||
<code user> | <code user> | ||
- | awk -f prog.awk file.txt | + | awk -f prog.awk file.txt</code> |
+ | <code> | ||
F : Moy : 9 ans nb : 3 | F : Moy : 9 ans nb : 3 | ||
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> |