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 04:31]
smolski
doc:programmation:awk [20/10/2012 09:59]
paskal
Ligne 1: Ligne 1:
 ====== awk ====== ====== awk ======
  
-(//non testé// - **smolski** 18/10/2012) Le retour sur le forum est ici : +(//testé// - **smolski** 18/10/2012) Le retour sur le forum est ici : 
-  * [[//url// | 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 - 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 [[commande:​grep]] et [[commande:​sed]]. //
   * Débutant, à savoir :   * Débutant, à savoir :
 [[manuel:​le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) [[manuel:​le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-)
Ligne 24: Ligne 24:
 Et rédigez(([[commande:​cat]])) dedans cette liste ainsi : Et rédigez(([[commande:​cat]])) dedans cette liste ainsi :
 <code bash> <code bash>
-cat file.txt <<EOS+cat >  ​file.txt <<EOS
 Nom             ​Genre ​          Age Nom             ​Genre ​          Age
 --------------------------------------- ---------------------------------------
Ligne 38: Ligne 38:
  
 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>
 +awk '{ print $1, $2 }' file.txt</​code>​
 +<​code>​
 +Nom Genre
 +--------------------------------------- ​
 +CAMILLE M
 +CHLOE F
 +CLARA F
 +CLEMENT M
 +EMMA F
 +THEO M</​code>​
 +
 +<​note>​
 +  * $1 correspond à la première colonne, $2 la seconde, $3 la troisième...
 +  * $0 correspond à la ligne entière
 +</​note>​
 +
 +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>​
 +
 +==== Filtres et regexp ====
 +
 +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.
 +
 +Retrouver les lignes qui contiennent CAMILLE :
 +<code bash>
 +awk '/​CAMILLE/​ { print $1, $3, $2 }' file.txt</​code>​
 +<​code>​
 +CAMILLE 7 M</​code>​
 +
 +**Nota** : \\
 +L'​ordre des colonnes a été modifié pour l'​exemple.
 +
 +Un autre filtre plus complexe, rechercher les lignes qui commencent par C et qui contiennent la lettre A ou la lettre O :
 +<code bash>
 +awk '/​^C.*[AO]/​ { print $1, $3, $2 }' file.txt</​code>​
 +<​code>​
 +CAMILLE 7 M
 +CHLOE 12 F
 +CLARA 11 F</​code>​
 +
 +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 :
 +<code bash>
 +awk '/​^CL/,/​^E/​ { print $0 }' file.txt</​code>​
 +<​code>​
 +CLARA F 11
 +CLEMENT M 7
 +EMMA F 6</​code>​
 +
 +==== Variables awk ====
 +
 +awk fournit des variables utiles qui peuvent être utilisées, affichées, calculées ou assignées.
 +
 +=== Variable NR NF ===
 +
 +  * NR : nombre d'​enregistrements (numéro de ligne).
 +  * NF : nombre de champs (nombre de colonnes).
 +
 +<code bash>
 +awk '{ print NR, NF, $0 }' file.txt</​code>​
 +<​code>​
 +1 3 Nom         ​Genre ​          Age
 +2 1 ---------------------------------------
 +3 3 CAMILLE ​            ​M ​              7
 +4 3 CHLOE               ​F ​              12
 +5 3 CLARA               ​F ​              11
 +6 3 CLEMENT ​            ​M ​              7
 +7 3 EMMA                F               6
 +8 3 THEO                M               ​8</​code>​
 +
 +=== Variable FS OFS ===
 +
 +  * FS : Séparateur de champ (par défaut : espace/​tabulation).
 +  * OFS : Séparateur de champ en sortie (par défaut : espace).
 +<code bash>
 +awk '/​CAMILLE/​ { OFS=","​ ; print $2,$1 }' file.txt</​code>​
 +<​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>​
 +
 +==== Scripts awk ====
 +
 +<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 :
 +   ​prog.awk
 +<code bash>
 +cat > prog.awk <<EOS
 +/^CL/,/^E/ { 
 +     print NR, \$0 
 +}
 +EOS</​code>​
 +
 +Puis interprété grâce à l'​option -f :
 +<code bash>
 +awk -f prog.awk file.txt</​code>​
 +<​code>​
 +5 CLARA F 11
 +6 CLEMENT M 7
 +7 EMMA F 6</​code>​
 +
 +==== 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 :
 +<code bash>
 +cat > prog.awk <<EOS
 +/​^CL/,/​^E/ ​
 +BEGIN {
 +        action
 +}
 +
 +/​filter/,/​filter/​ { action }
 +
 +{ action}
 +
 +END {
 +        action
 +}
 +EOS</​code>​
 +
 +Donne :
 +<code bash>
 +awk -f prog.awk file.txt </​code>​
 +<​code>​
 +CLARA           ​F ​              11
 +CLEMENT ​        ​M ​              7
 +EMMA            F               ​6</​code>​
 +
 +Les blocs BEGIN et END ne sont pas obligatoires. Il peut y avoir un bloc BEGIN sans bloc END, un bloc END sans bloc BEGIN, ou aucun de ces 2 blocs.
 +
 +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>
 +cat > prog.awk <<EOS
 +BEGIN { 
 +        FS=" "
 +        OFS=";"​
 +}
 +
 +        print \$1, \$3 
 +}
 +END { 
 +        printf "\nThe file has %d lines\n",​ NR 
 +}
 +EOS</​code>​
 +
 +
 +<code bash>
 +awk -f prog.awk file.txt</​code>​
 +<​code>​
 +Nom;Age
 +---------------------------------------;​
 +CAMILLE;7
 +CHLOE;12
 +CLARA;11
 +CLEMENT;7
 +EMMA;6
 +THEO;8
 +
 +The file has 8 lines </​code>​
 +
 +<note warning>​**ATTENTION** ! Vérifiez toujours l'​écriture de chaque script donné ici avant de l'​appliquer !</​note>​
 +
 +
 +===== Fonctions =====
 +
 +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 :
 +
 +==== toupper tolower ====
 +
 +Convertir du texte en majuscules ou en minuscules avec les fonctions toupper et tolower
 +<code bash>
 +awk '/​THEO/​ { print $1, tolower($1) }' file.txt</​code>​
 +<​code>​
 +THEO theo</​code>​
 +
 +==== int ====
 +
 +Convertir une valeur en entier avec la fonction **int** :
 +<code bash>
 +awk '/​CHLOE/​ { print $3, int($3/​5)}'​ file.txt</​code>​
 +<​code>​
 +12 2</​code>​
 +
 +==== printf ====
 +
 +La fonction printf avec awk fonctionne comme la fonction printf en C afin de formater la sortie :
 +<code bash>
 +awk 'NR > 2 { printf "%10s %02d %-10s\n",​ $1,$3, $1}' file.txt</​code>​
 +<​code>​
 +   ​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 bash>
 +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 bash>
 +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 bash>
 +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 bash>
 +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 bash>
 +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 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]]
  
-awk '{ print $1, $2 }' file.txt 
doc/programmation/awk.txt · Dernière modification: 02/06/2015 18:44 par milou

Pied de page des forums

Propulsé par FluxBB