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 13:01]
smolski
doc:programmation:awk [22/09/2013 23:31]
127.0.0.1 modification externe
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à !.]] :-)
  
 ===== Introduction ===== ===== Introduction =====
Ligne 18: Ligne 18:
 ===== Exercices ===== ===== Exercices =====
  
-Créez le fichier(([[commande:touch]])) file.txt ainsi :+Créez le fichier(([[:​doc:​systeme:touch]])) file.txt ainsi :
 <code bash> <code bash>
 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 bash>
 cat >  file.txt <<EOS cat >  file.txt <<EOS
Ligne 39: Ligne 39:
 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 bash>
-awk '{ print $1, $2 }' file.txt+awk '{ print $1, $2 }' file.txt</​code>​ 
 +<​code>​
 Nom Genre Nom Genre
 --------------------------------------- ​ --------------------------------------- ​
Ligne 63: Ligne 64:
 Retrouver les lignes qui contiennent CAMILLE : Retrouver les lignes qui contiennent CAMILLE :
 <code bash> <code bash>
-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 71: Ligne 73:
 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 bash>
-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 79: Ligne 82:
 Pour récupérer les lignes de CL à E, tapez : Pour récupérer les lignes de CL à E, tapez :
 <code bash> <code bash>
-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 94: Ligne 98:
  
 <code bash> <code bash>
-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 109: Ligne 114:
   * 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 bash>
-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 123: Ligne 129:
 cat > prog.awk <<EOS cat > prog.awk <<EOS
 /^CL/,/^E/ {  /^CL/,/^E/ { 
-     print NR, $0 +     print NR, \$0 
 } }
 EOS</​code>​ EOS</​code>​
Ligne 129: Ligne 135:
 Puis interprété grâce à l'​option -f : Puis interprété grâce à l'​option -f :
 <code bash> <code bash>
-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 157: Ligne 164:
 Donne : Donne :
 <code bash> <code bash>
-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 172: Ligne 180:
 } }
  
-        print $1, $3 +        print \$1, \$3 
 } }
 END {  END { 
Ligne 181: Ligne 189:
  
 <code bash> <code bash>
-awk -f prog.awk file.txt +awk -f prog.awk file.txt</​code>​ 
 +<​code>​
 Nom;Age Nom;Age
 ---------------------------------------;​ ---------------------------------------;​
Ligne 280: Ligne 288:
 THEO HEO</​code>​ 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]]
  
-//À suivre...// **Jojo** ;-) 
doc/programmation/awk.txt · Dernière modification: 02/06/2015 18:44 par milou

Pied de page des forums

Propulsé par FluxBB