logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

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 → ODT PDF Export

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

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 08:39]
smolski
doc:programmation:awk [27/10/2013 16:50]
smolski
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à !.]] :-) 
 +    * 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 18: Ligne 25:
 ===== Exercices ===== ===== Exercices =====
  
-Créez le fichier(([[commande: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(([[commande: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 <<EOS
 Nom             ​Genre ​          Age Nom             ​Genre ​          Age
Ligne 38: Ligne 45:
  
 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+awk '{ print $1, $2 }' file.txt</​code>​ 
 +<​code>​
 Nom Genre Nom Genre
 --------------------------------------- ​ --------------------------------------- ​
Ligne 62: 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+awk '/​CAMILLE/​ { print $1, $3, $2 }' file.txt</​code>​ 
 +<​code>​
 CAMILLE 7 M</​code>​ CAMILLE 7 M</​code>​
  
Ligne 70: 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+awk '/​^C.*[AO]/​ { print $1, $3, $2 }' file.txt</​code>​ 
 +<​code>​
 CAMILLE 7 M CAMILLE 7 M
 CHLOE 12 F CHLOE 12 F
Ligne 78: 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+awk '/​^CL/,/​^E/​ { print $0 }' file.txt</​code>​ 
 +<​code>​
 CLARA F 11 CLARA F 11
 CLEMENT M 7 CLEMENT M 7
Ligne 93: 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+awk '{ print NR, NF, $0 }' file.txt</​code>​ 
 +<​code>​
 1 3 Nom         ​Genre ​          Age 1 3 Nom         ​Genre ​          Age
 2 1 --------------------------------------- 2 1 ---------------------------------------
Ligne 108: 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+awk '/​CAMILLE/​ { OFS=","​ ; print $2,$1 }' file.txt</​code>​ 
 +<​code>​
 M,​CAMILLE</​code>​ M,​CAMILLE</​code>​
  
Ligne 118: 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 <<EOS cat > prog.awk <<EOS
 /^CL/,/^E/ {  /^CL/,/^E/ { 
-     print NR, $0 +     print NR, \$0 
 } }
 EOS</​code>​ EOS</​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+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 139: 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 <<EOS
 /​^CL/,/​^E/ ​ /​^CL/,/​^E/ ​
Ligne 156: Ligne 169:
  
 Donne : Donne :
-<​code ​bash+<​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 165: 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 <<EOS
 BEGIN {  BEGIN { 
Ligne 172: Ligne 186:
 } }
  
-        print $1, $3 +        print \$1, \$3 
 } }
 END {  END { 
Ligne 180: Ligne 194:
  
  
-<​code ​bash+<​code ​user
-awk -f prog.awk file.txt +awk -f prog.awk file.txt</​code>​ 
 +<​code>​
 Nom;Age Nom;Age
 ---------------------------------------;​ ---------------------------------------;​
Ligne 201: Ligne 215:
 Le parseur awk offre beaucoup de fonctions internes très utiles pour traiter les données. \\ Le parseur awk offre beaucoup de fonctions internes très utiles pour traiter les données. \\
 Consulter les manuels de l'​utilitaire awk pour la liste complète des fonctions internes, en voici une liste partielle : Consulter les manuels de l'​utilitaire awk pour la liste complète des fonctions internes, en voici une liste partielle :
 +
 +==== toupper tolower ====
 +
 +Convertir du texte en majuscules ou en minuscules avec les fonctions toupper et tolower
 +<code user>
 +awk '/​THEO/​ { print $1, tolower($1) }' file.txt</​code>​
 +<​code>​
 +THEO theo</​code>​
  
 ==== int ==== ==== int ====
  
 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+awk '/​CHLOE/​ { print $3, int($3/​5)}'​ file.txt</​code>​ 
 +<​code>​
 12 2</​code>​ 12 2</​code>​
  
 +==== printf ====
 +
 +La fonction printf avec awk fonctionne comme la fonction printf en C afin de formater la sortie :
 +<code user>
 +awk 'NR > 2 { printf "%10s %02d %-10s\n",​ $1,$3, $1}' file.txt
 +
 +   ​CAMILLE 07 CAMILLE ​  
 +     CHLOE 12 CHLOE     
 +     CLARA 11 CLARA     
 +   ​CLEMENT 07 CLEMENT ​  
 +      EMMA 06 EMMA      ​
 +      THEO 08 THEO </​code>​
 +
 +==== length ====
 +
 +Afficher la taille d'une chaîne de caractères avec la fonction length :
 +<code user>
 +awk '/​CLEM/​ { print $1, length($1) }' file.txt</​code>​
 +<​code>​
 +CLEMENT 7</​code>​
 +
 +==== 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>
 +awk 'NR >2 { print $1, match($1,"​A"​)}'​ file.txt</​code>​
 +<​code>​
 +CAMILLE 2
 +CHLOE 0
 +CLARA 3
 +CLEMENT 0
 +EMMA 4
 +THEO 0</​code>​
 +
 +==== gsub ====
 +
 +Remplacer des chaînes de caractères avec la fonction gsub :
 +<code user>
 +awk 'NR >2 { gsub("​A","​_",​$1) ; print $1 }' file.txt</​code>​
 +<​code>​
 +C_MILLE
 +CHLOE
 +CL_R_
 +CLEMENT
 +EMM_
 +THEO</​code>​
 +
 +==== substr ====
 +
 +Extraire une portion de texte avec la fonction substr :
 +<code user>
 +awk '{ print $1, substr($1,​2,​3) }' file.txt</​code>​
 +<​code>​
 +Nom om
 +--------------------------------------- ---
 +CAMILLE AMI
 +CHLOE HLO
 +CLARA LAR
 +CLEMENT LEM
 +EMMA MMA
 +THEO HEO</​code>​
 +
 +==== Fonctions utilisateur ====
 +
 +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>​
 +cat > prog.awk <<EOS
 +function gentag(nom,​age) {
 +        tmp=tolower(substr(nom,​1,​3))
 +        return tmp "​_"​ age
 +}
 +
 +BEGIN { 
 +        FS=" "
 +        OFS=";"​
 +}
 +
 +
 +        print \$1, \$3, gentag(\$1,​\$3)
 +}
 +
 +END { 
 +print NR , "​lines"​
 +}
 +EOS
 +</​code>​
 +
 +<code bash>
 +awk -f prog.awk file.txt</​code>​
 +<​code>​
 +Nom;​Age;​nom_Age
 +---------------------------------------;;​---_
 +CAMILLE;​7;​cam_7
 +CHLOE;​12;​chl_12
 +CLARA;​11;​cla_11
 +CLEMENT;​7;​cle_7
 +EMMA;​6;​emm_6
 +THEO;​8;​the_8
 +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 user prog_awk>​
 +cat > prog.awk <<EOS
 +BEGIN {
 +        OFS=","​
 +}
 +NR <=2 { next }
 +{
 +        if ( \$3 < 11 ) {
 +                ecole="​primaire"​
 +        } else {
 +                ecole="​college"​
 +        }
 +
 +        print \$1, ecole
 +}
 +EOS
 +</​code>​
 +
 +<code user>
 +awk -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 user prog_awk>​
 +cat > prog.awk <<EOS
 +NR <=2 { next }
 +{
 +        min=1
 +        printf "​%-10s",​ \$1
 +        while  ( min <= \$3 ) {
 +                printf "​."​
 +                min++
 +        }
 +        printf "​\n"​
 +}
 +EOS
 +</​code>​
 +
 +<code user>
 +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 user prog_awk>​
 +cat > prog.awk <<EOS
 +NR <=2 { next }
 +{
 +        printf "​%-10s",​ \$1
 +        for ( min=1 ; min <= \$3; min++ ) {
 +                printf "​."​
 +        }
 +        printf "​\n"​
 +}
 +EOS
 +</​code>​
 +
 +<code user>
 +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 user prog_awk>​
 +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 user>
 +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** ;-) 
doc/programmation/awk.txt · Dernière modification: 02/06/2015 18:44 par milou

Pied de page des forums

Propulsé par FluxBB