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 [22/09/2013 23:31] 127.0.0.1 modification externe |
doc:programmation:awk [27/10/2013 17:02] smolski |
||
---|---|---|---|
Ligne 8: | Ligne 8: | ||
* Débutant, à savoir : | * Débutant, à savoir : | ||
[[:doc:systeme:commandes: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à !.]] :-) | ||
+ | * Création par **smolski** 18/10/2012) | ||
+ | * Testé par **smolski** le 18/10/2012) | ||
+ | * 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 ===== | ||
- | awk est un langage de programmation datant de 1977, date de son apparition dans le monde Unix. Il tire son nom des trois programmeurs qui l'ont développé : Alfred V. Aho, Peter J. Weinberger et Brian W. Kernighan. \\ | + | **awk** est un langage de programmation datant de 1977, date de son apparition dans le monde Unix. Il tire son nom des trois programmeurs qui l'ont développé : Alfred V. Aho, Peter J. Weinberger et Brian W. Kernighan. \\ |
Cet utilitaire a été créé dans le but de remplacer les commandes grep et sed. Sa grande souplesse lui a permis de connaître un succès immédiat. Et de nouvelles versions sont apparues au fil du temps : nawk et gawk aujourd'hui. | Cet utilitaire a été créé dans le but de remplacer les commandes grep et sed. Sa grande souplesse lui a permis de connaître un succès immédiat. Et de nouvelles versions sont apparues au fil du temps : nawk et gawk aujourd'hui. | ||
Ligne 19: | Ligne 26: | ||
Créez le fichier(([[:doc:systeme:touch]])) file.txt ainsi : | Créez le fichier(([[:doc:systeme:touch]])) file.txt ainsi : | ||
- | <code bash> | + | <code user> |
touch file.txt</code> | touch file.txt</code> | ||
Et rédigez(([[:doc:systeme:cat]])) dedans cette liste ainsi : | Et rédigez(([[:doc:systeme:cat]])) dedans cette liste ainsi : | ||
- | <code bash> | + | <code user tp_awk1> |
- | cat > file.txt <<EOS | + | cat > file.txt <<EOF |
Nom Genre Age | Nom Genre Age | ||
--------------------------------------- | --------------------------------------- | ||
Ligne 33: | Ligne 40: | ||
EMMA F 6 | EMMA F 6 | ||
THEO M 8 | THEO M 8 | ||
- | EOS</code> | + | EOF</code> |
==== Extraire des colonnes ==== | ==== Extraire des colonnes ==== | ||
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 bash> | + | <code user> |
awk '{ print $1, $2 }' file.txt</code> | awk '{ print $1, $2 }' file.txt</code> | ||
<code> | <code> | ||
Ligne 63: | Ligne 70: | ||
Retrouver les lignes qui contiennent CAMILLE : | Retrouver les lignes qui contiennent CAMILLE : | ||
- | <code bash> | + | <code user> |
awk '/CAMILLE/ { print $1, $3, $2 }' file.txt</code> | awk '/CAMILLE/ { print $1, $3, $2 }' file.txt</code> | ||
<code> | <code> | ||
Ligne 72: | Ligne 79: | ||
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 bash> | + | <code user> |
awk '/^C.*[AO]/ { print $1, $3, $2 }' file.txt</code> | awk '/^C.*[AO]/ { print $1, $3, $2 }' file.txt</code> | ||
<code> | <code> | ||
Ligne 81: | Ligne 88: | ||
awk est également très utile et puissant pour gérer des filtres sur des paragraphes. \\ | awk est également très utile et puissant pour gérer des filtres sur des paragraphes. \\ | ||
Pour récupérer les lignes de CL à E, tapez : | Pour récupérer les lignes de CL à E, tapez : | ||
- | <code bash> | + | <code user> |
awk '/^CL/,/^E/ { print $0 }' file.txt</code> | awk '/^CL/,/^E/ { print $0 }' file.txt</code> | ||
<code> | <code> | ||
Ligne 97: | Ligne 104: | ||
* NF : nombre de champs (nombre de colonnes). | * NF : nombre de champs (nombre de colonnes). | ||
- | <code bash> | + | <code user> |
awk '{ print NR, NF, $0 }' file.txt</code> | awk '{ print NR, NF, $0 }' file.txt</code> | ||
<code> | <code> | ||
Ligne 113: | Ligne 120: | ||
* FS : Séparateur de champ (par défaut : espace/tabulation). | * FS : Séparateur de champ (par défaut : espace/tabulation). | ||
* OFS : Séparateur de champ en sortie (par défaut : espace). | * OFS : Séparateur de champ en sortie (par défaut : espace). | ||
- | <code bash> | + | <code user> |
awk '/CAMILLE/ { OFS="," ; print $2,$1 }' file.txt</code> | awk '/CAMILLE/ { OFS="," ; print $2,$1 }' file.txt</code> | ||
<code> | <code> | ||
Ligne 124: | Ligne 131: | ||
<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 !</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 : | + | 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 : |
- | prog.awk | + | <code user prog.awk> |
- | <code bash> | + | cat > prog.awk <<EOF |
- | cat > prog.awk <<EOS | + | |
/^CL/,/^E/ { | /^CL/,/^E/ { | ||
print NR, \$0 | print NR, \$0 | ||
} | } | ||
- | EOS</code> | + | EOF</code> |
Puis interprété grâce à l'option -f : | Puis interprété grâce à l'option -f : | ||
- | <code bash> | + | <code user> |
awk -f prog.awk file.txt</code> | awk -f prog.awk file.txt</code> | ||
<code> | <code> | ||
Ligne 146: | Ligne 152: | ||
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 bash> | + | <code user prog_awk> |
- | cat > prog.awk <<EOS | + | cat > prog.awk <<EOF |
/^CL/,/^E/ | /^CL/,/^E/ | ||
BEGIN { | BEGIN { | ||
Ligne 160: | Ligne 166: | ||
action | action | ||
} | } | ||
- | EOS</code> | + | EOF</code> |
Donne : | Donne : | ||
- | <code bash> | + | <code user> |
- | awk -f prog.awk file.txt </code> | + | awk -f prog.awk file.txt</code> |
<code> | <code> | ||
CLARA F 11 | CLARA F 11 | ||
Ligne 173: | Ligne 179: | ||
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 bash> | + | <code user prog_awk> |
- | cat > prog.awk <<EOS | + | cat > prog.awk <<EOF |
BEGIN { | BEGIN { | ||
FS=" " | FS=" " | ||
Ligne 185: | Ligne 191: | ||
printf "\nThe file has %d lines\n", NR | printf "\nThe file has %d lines\n", NR | ||
} | } | ||
- | EOS</code> | + | EOF</code> |
- | <code bash> | + | <code user> |
awk -f prog.awk file.txt</code> | awk -f prog.awk file.txt</code> | ||
<code> | <code> | ||
Ligne 213: | Ligne 219: | ||
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 bash> | + | <code user> |
awk '/THEO/ { print $1, tolower($1) }' file.txt</code> | awk '/THEO/ { print $1, tolower($1) }' file.txt</code> | ||
<code> | <code> | ||
Ligne 221: | Ligne 227: | ||
Convertir une valeur en entier avec la fonction **int** : | Convertir une valeur en entier avec la fonction **int** : | ||
- | <code bash> | + | <code user> |
awk '/CHLOE/ { print $3, int($3/5)}' file.txt</code> | awk '/CHLOE/ { print $3, int($3/5)}' file.txt</code> | ||
<code> | <code> | ||
Ligne 229: | Ligne 235: | ||
La fonction printf avec awk fonctionne comme la fonction printf en C afin de formater la sortie : | La fonction printf avec awk fonctionne comme la fonction printf en C afin de formater la sortie : | ||
- | <code bash> | + | <code user> |
- | awk 'NR > 2 { printf "%10s %02d %-10s\n", $1,$3, $1}' file.txt</code> | + | awk 'NR > 2 { printf "%10s %02d %-10s\n", $1,$3, $1}' file.txt |
- | <code> | + | |
CAMILLE 07 CAMILLE | CAMILLE 07 CAMILLE | ||
CHLOE 12 CHLOE | CHLOE 12 CHLOE | ||
Ligne 242: | Ligne 248: | ||
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 bash> | + | <code user> |
awk '/CLEM/ { print $1, length($1) }' file.txt</code> | awk '/CLEM/ { print $1, length($1) }' file.txt</code> | ||
<code> | <code> | ||
Ligne 250: | Ligne 256: | ||
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 bash> | + | <code user> |
awk 'NR >2 { print $1, match($1,"A")}' file.txt</code> | awk 'NR >2 { print $1, match($1,"A")}' file.txt</code> | ||
<code> | <code> | ||
Ligne 263: | Ligne 269: | ||
Remplacer des chaînes de caractères avec la fonction gsub : | Remplacer des chaînes de caractères avec la fonction gsub : | ||
- | <code bash> | + | <code user> |
awk 'NR >2 { gsub("A","_",$1) ; print $1 }' file.txt</code> | awk 'NR >2 { gsub("A","_",$1) ; print $1 }' file.txt</code> | ||
<code> | <code> | ||
Ligne 276: | Ligne 282: | ||
Extraire une portion de texte avec la fonction substr : | Extraire une portion de texte avec la fonction substr : | ||
- | <code bash> | + | <code user> |
awk '{ print $1, substr($1,2,3) }' file.txt</code> | awk '{ print $1, substr($1,2,3) }' file.txt</code> | ||
<code> | <code> | ||
Ligne 291: | Ligne 297: | ||
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 bash> | + | <code user prog_awk> |
- | cat > prog.awk <<EOS | + | 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 310: | Ligne 316: | ||
print NR , "lines" | print NR , "lines" | ||
} | } | ||
- | EOS | + | EOF |
</code> | </code> | ||
<code bash> | <code bash> | ||
awk -f prog.awk file.txt</code> | awk -f prog.awk file.txt</code> | ||
- | |||
<code> | <code> | ||
Nom;Age;nom_Age | Nom;Age;nom_Age | ||
Ligne 334: | Ligne 339: | ||
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 bash> | + | <code user prog_awk> |
- | cat prog.awk <<EOS | + | cat > prog.awk <<EOF |
BEGIN { | BEGIN { | ||
OFS="," | OFS="," | ||
Ligne 349: | Ligne 354: | ||
print \$1, ecole | print \$1, ecole | ||
} | } | ||
- | EOS </code> | + | EOF |
- | <code bash> | + | </code> |
- | nawk -f prog.awk file.txt</code> | + | |
+ | <code user> | ||
+ | awk -f prog.awk file.txt</code> | ||
<code> | <code> | ||
CAMILLE,primaire | CAMILLE,primaire | ||
Ligne 365: | Ligne 372: | ||
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 bash> | + | <code user prog_awk> |
- | cat > prog.awk | + | cat > prog.awk <<EOF |
NR <=2 { next } | NR <=2 { next } | ||
{ | { | ||
Ligne 377: | Ligne 384: | ||
printf "\n" | printf "\n" | ||
} | } | ||
- | <code bash> | + | EOF |
+ | </code> | ||
+ | |||
+ | <code user> | ||
awk -f prog.awk file.txt</code> | awk -f prog.awk file.txt</code> | ||
<code> | <code> | ||
Ligne 390: | Ligne 400: | ||
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 bash> | + | <code user prog_awk> |
- | cat > prog.awk <<EOS | + | cat > prog.awk <<EOF |
NR <=2 { next } | NR <=2 { next } | ||
{ | { | ||
Ligne 399: | Ligne 409: | ||
} | } | ||
printf "\n" | printf "\n" | ||
- | }EOS | + | } |
+ | EOF | ||
</code> | </code> | ||
- | <code bash> | + | <code user> |
awk -f prog.awk file.txt</code> | awk -f prog.awk file.txt</code> | ||
<code> | <code> | ||
Ligne 420: | Ligne 431: | ||
Calculer la moyenne d'âge des enfants par sexe : | Calculer la moyenne d'âge des enfants par sexe : | ||
- | <code bash> | + | <code user prog_awk> |
- | cat < prog.awk <<EOS | + | cat > prog.awk <<EOF |
{ | { | ||
if ( NR <= 2 ) { next } # skip first 2 lines | if ( NR <= 2 ) { next } # skip first 2 lines | ||
Ligne 431: | Ligne 442: | ||
print genre, " : ", "Moy :", int(tab_age[genre]/tab_cpt[genre]), "ans", "nb :", tab_cpt[genre] | print genre, " : ", "Moy :", int(tab_age[genre]/tab_cpt[genre]), "ans", "nb :", tab_cpt[genre] | ||
} | } | ||
- | }EOS | + | } |
+ | EOF | ||
</code> | </code> | ||
- | <code bash> | + | <code user> |
awk -f prog.awk file.txt</code> | awk -f prog.awk file.txt</code> | ||
<code> | <code> |