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 [22/09/2013 23:31]
127.0.0.1 modification externe
doc:programmation:awk [27/10/2013 18:38]
smolski [Exercices]
Ligne 1: Ligne 1:
 ====== awk ====== ====== awk ======
  
-(//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 part de vos remarques, succès, améliorations ou échecs ! 
   * Objet : awk   * Objet : awk
-  * Niveau requis : AVISÉ+  * Niveau requis : {{tag>​avisé}}
   * Commentaires : // Cet utilitaire a été créé dans le but de remplacer les commandes [[:​doc:​systeme:​grep]] et [[:​doc:​systeme:​sed]]. //   * Commentaires : // Cet utilitaire a été créé dans le but de remplacer les commandes [[:​doc:​systeme:​grep]] et [[:​doc:​systeme:​sed]]. //
-  * Débutant, à savoir : +  ​* Suivi : {{tag>​à-compléter}} 
-[[:​doc:​systeme:​commandes:​le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-)+  ​* Débutant, à savoir : [[:​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 28/​10/​2013) 
 +  * 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 23:
 ===== 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 ​bash> +<​code ​raw file.txt>​
-touch file.txt</code> +
- +
-Et rédigez(([[:​doc:​systeme:​cat]])) dedans cette liste ainsi : +
-<code bash> +
-cat >  file.txt <<EOS+
 Nom             ​Genre ​          Age Nom             ​Genre ​          Age
 --------------------------------------- ---------------------------------------
Ligne 33: Ligne 33:
 EMMA            F               6 EMMA            F               6
 THEO            M               8 THEO            M               8
-EOS</​code>​+</​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 50: Ligne 50:
 THEO M</​code>​ THEO M</​code>​
  
-<​note>​+<​note ​pip>
   * $1 correspond à la première colonne, $2 la seconde, $3 la troisième...   * $1 correspond à la première colonne, $2 la seconde, $3 la troisième...
   * $0 correspond à la ligne entière   * $0 correspond à la ligne entière
Ligne 56: Ligne 56:
  
 Dans le format de la sortie, les tabulations sont remplacées par un espace qui est le séparateur de sortie par défaut. 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>​+<note important>​Par défaut, les espaces et tabulations ​contigües ​sont considérées ​comme un séparateur unique. Il s'agit de la seule exception.</​note>​
  
 ==== Filtres et regexp ==== ==== Filtres et regexp ====
 +
 +<note warning>​**ATTENTION** ! Vérifiez toujours l'​écriture de chaque script donné ici avant de l'​appliquer ! \\
 +Lien utile : **[[doc:​programmation:​shell:​regexp | Les Regexp.]]** //Et c'est pas la peine de faire Ouch..! Tuto inévitable à ce niveau.// :​-P</​note>​
  
 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. 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 : 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 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 ​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 84:
 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 100:
   * 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 116:
   * 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>​
 M,​CAMILLE</​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>​+<​note ​tip>À 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 ==== ==== 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''​ comme ici : 
- +<​code ​awk prog.awk>
-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/ {  /^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 ​bash>+<​code ​user>
 awk -f prog.awk file.txt</​code>​ awk -f prog.awk file.txt</​code>​
 <​code>​ <​code>​
Ligne 142: Ligne 141:
  
 ==== Pré et Post opérations ==== ==== 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 : 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 ​awk prog.awk>
-cat > prog.awk ​<<EOS+
 /​^CL/,/​^E/ ​ /​^CL/,/​^E/ ​
 BEGIN { BEGIN {
Ligne 160: Ligne 156:
         action         action
 } }
-EOS</​code>​+</​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 169:
  
 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 ​awk prog.awk>
-cat > prog.awk ​<<EOS+
 BEGIN {  BEGIN { 
         FS=" "         FS=" "
Ligne 180: Ligne 175:
 } }
  
-        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 ​bash>+<​code ​user>
 awk -f prog.awk file.txt</​code>​ awk -f prog.awk file.txt</​code>​
 <​code>​ <​code>​
Ligne 202: Ligne 197:
 The file has 8 lines </​code>​ The file has 8 lines </​code>​
  
-<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 ! //Bis.// :-P</​note>​
  
  
Ligne 213: Ligne 208:
  
 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 216:
  
 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 224:
  
 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 237:
  
 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 245:
  
 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 258:
  
 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 271:
  
 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 286:
  
 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 ​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 304: Ligne 298:
  
  
-        print \$1, \$3, gentag(\$1,\$3)+        print $1, $3, gentag($1,​$3)
 } }
  
Ligne 310: Ligne 304:
 print NR , "​lines"​ print NR , "​lines"​
 } }
-EOS 
 </​code>​ </​code>​
  
-<​code ​bash>+<​code ​user>
 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 326:
  
 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 ​awk prog.awk>
-cat prog.awk ​<<EOS+
 BEGIN { BEGIN {
         OFS=","​         OFS=","​
Ligne 341: Ligne 332:
 NR <=2 { next } NR <=2 { next }
 { {
-        if ( \$3 < 11 ) {+        if ( $3 < 11 ) {
                 ecole="​primaire"​                 ecole="​primaire"​
         } else {         } else {
Ligne 347: Ligne 338:
         }         }
  
-        print \$1, ecole+        print $1, ecole
 } }
-EOS </​code>​ +</​code>​ 
-<​code ​bash+ 
-nawk -f prog.awk file.txt</​code>​+<​code ​user
 +awk -f prog.awk file.txt</​code>​
 <​code>​ <​code>​
 CAMILLE,​primaire CAMILLE,​primaire
Ligne 360: Ligne 352:
 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 ​bash> +<​code ​awk prog.awk>
-cat > prog.awk+
 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 377: Ligne 368:
         printf "​\n"​         printf "​\n"​
 } }
-<​code ​bash>+</code
 + 
 +<code user>
 awk -f prog.awk file.txt</​code>​ awk -f prog.awk file.txt</​code>​
 <​code>​ <​code>​
Ligne 390: Ligne 383:
  
 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 ​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 ​bash>+<​code ​user>
 awk -f prog.awk file.txt</​code>​ awk -f prog.awk file.txt</​code>​
 <​code>​ <​code>​
Ligne 420: Ligne 412:
  
 Calculer la moyenne d'âge des enfants par sexe : Calculer la moyenne d'âge des enfants par sexe :
-<​code ​bash> +<​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 431: Ligne 422:
         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+}
 </​code>​ </​code>​
  
-<​code ​bash>+<​code ​user>
 awk -f prog.awk file.txt</​code>​ awk -f prog.awk file.txt</​code>​
 <​code>​ <​code>​
Ligne 440: Ligne 431:
 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>​
  
  
doc/programmation/awk.txt · Dernière modification: 02/06/2015 18:44 par milou

Pied de page des forums

Propulsé par FluxBB