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
doc:programmation:awk [27/10/2013 17:11]
smolski [Programmation]
doc:programmation:awk [02/06/2015 18:44] (Version actuelle)
milou [Programmation]
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>​débutant 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 : +  * 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à !.]] :-) +  * Suivi : {{tag>}} 
-    * Création par **smolski** ​18/10/2012+    * Création par [[user>​smolski]] 18/​10/​2012) 
-    * Testé par **smolski** le 18/10/2012)+    ​Testé par **[[user>smolski]]** le 28/10/2013
 +    * Testé par **[[user>​MicP]]** 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 !))    * 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 =====
Ligne 25: Ligne 21:
 ===== 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 ​user> +<​code ​raw file.txt>​
-touch file.txt</code> +
- +
-Et rédigez(([[:​doc:​systeme:​cat]])) dedans cette liste ainsi : +
-<code user tp_awk1>​ +
-cat >  file.txt <<EOF+
 Nom             ​Genre ​          Age Nom             ​Genre ​          Age
 --------------------------------------- ---------------------------------------
Ligne 40: Ligne 31:
 EMMA            F               6 EMMA            F               6
 THEO            M               8 THEO            M               8
-EOF</​code>​+</​code>​
  
 ==== Extraire des colonnes ==== ==== Extraire des colonnes ====
Ligne 47: Ligne 38:
 <code user> <code user>
 awk '{ print $1, $2 }' file.txt</​code>​ awk '{ print $1, $2 }' file.txt</​code>​
-<code>+<file config retour de la commande
 Nom Genre Nom Genre
 --------------------------------------- ​ --------------------------------------- ​
Ligne 55: Ligne 46:
 CLEMENT M CLEMENT M
 EMMA F EMMA F
-THEO M</code>+THEO M</file>
  
-<​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 63: Ligne 54:
  
 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.
Ligne 72: Ligne 66:
 <code user> <code user>
 awk '/​CAMILLE/​ { print $1, $3, $2 }' file.txt</​code>​ awk '/​CAMILLE/​ { print $1, $3, $2 }' file.txt</​code>​
-<code+<file config retour de la commande>  
-CAMILLE 7 M</code>+CAMILLE 7 M</file>
  
 **Nota** : \\ **Nota** : \\
Ligne 81: Ligne 75:
 <code user> <code user>
 awk '/​^C.*[AO]/​ { print $1, $3, $2 }' file.txt</​code>​ awk '/​^C.*[AO]/​ { print $1, $3, $2 }' file.txt</​code>​
-<code>+<file config retour de la commande
 CAMILLE 7 M CAMILLE 7 M
 CHLOE 12 F CHLOE 12 F
-CLARA 11 F</code>+CLARA 11 F</file>
  
 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. \\
Ligne 90: Ligne 84:
 <code user> <code user>
 awk '/​^CL/,/​^E/​ { print $0 }' file.txt</​code>​ awk '/​^CL/,/​^E/​ { print $0 }' file.txt</​code>​
-<code>+<file config retour de la commande
 CLARA F 11 CLARA F 11
 CLEMENT M 7 CLEMENT M 7
-EMMA F 6</code>+EMMA F 6</file>
  
 ==== Variables awk ==== ==== Variables awk ====
Ligne 106: Ligne 100:
 <code user> <code user>
 awk '{ print NR, NF, $0 }' file.txt</​code>​ awk '{ print NR, NF, $0 }' file.txt</​code>​
-<code>+<file config retour de la commande
 1 3 Nom         ​Genre ​          Age 1 3 Nom         ​Genre ​          Age
 2 1 --------------------------------------- 2 1 ---------------------------------------
Ligne 114: Ligne 108:
 6 3 CLEMENT ​            ​M ​              7 6 3 CLEMENT ​            ​M ​              7
 7 3 EMMA                F               6 7 3 EMMA                F               6
-8 3 THEO                M               ​8</​code>+8 3 THEO                M               ​8</​file>
  
 === Variable FS OFS === === Variable FS OFS ===
Ligne 122: Ligne 116:
 <code user> <code user>
 awk '/​CAMILLE/​ { OFS=","​ ; print $2,$1 }' file.txt</​code>​ awk '/​CAMILLE/​ { OFS=","​ ; print $2,$1 }' file.txt</​code>​
-<code+<file config retour de la commande>  
-M,​CAMILLE</​code>+M,​CAMILLE</​file>
  
-<​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 : 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 ​user prog.awk>​ +<​code ​awk prog.awk>​
-cat > prog.awk <<EOF+
 /^CL/,/^E/ {  /^CL/,/^E/ { 
-     print NR, \$0 +     print NR, $0 
 } }
-EOF</​code>​+</​code>​
  
 Puis interprété grâce à l'​option -f : Puis interprété grâce à l'​option -f :
 <code user> <code user>
 awk -f prog.awk file.txt</​code>​ awk -f prog.awk file.txt</​code>​
-<code>+<file config retour de la commande
 5 CLARA F 11 5 CLARA F 11
 6 CLEMENT M 7 6 CLEMENT M 7
-7 EMMA F 6</code>+7 EMMA F 6</file>
  
 ==== 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 ​user prog_awk>​ +<​code ​awk prog.awk>
-cat > prog.awk ​<<EOF+
 /​^CL/,/​^E/ ​ /​^CL/,/​^E/ ​
 BEGIN { BEGIN {
Ligne 166: Ligne 154:
         action         action
 } }
-EOF</​code>​+</​code>​
  
 Donne : Donne :
 <code user> <code user>
 awk -f prog.awk file.txt</​code>​ awk -f prog.awk file.txt</​code>​
-<code>+<file config retour de la commande
 CLARA           ​F ​              11 CLARA           ​F ​              11
 CLEMENT ​        ​M ​              7 CLEMENT ​        ​M ​              7
-EMMA            F               ​6</​code>+EMMA            F               ​6</​file>
  
 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. 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 : 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 ​user prog_awk>​ +<​code ​awk prog.awk>
-cat > prog.awk ​<<EOF+
 BEGIN {  BEGIN { 
         FS=" "         FS=" "
Ligne 186: Ligne 173:
 } }
  
-        print \$1, \$3 +        print $1, $3 
 } }
 END {  END { 
         printf "\nThe file has %d lines\n",​ NR          printf "\nThe file has %d lines\n",​ NR 
 } }
-EOF</​code>​+</​code>​
  
  
 <code user> <code user>
 awk -f prog.awk file.txt</​code>​ awk -f prog.awk file.txt</​code>​
-<code>+<file config retour de la commande
 Nom;Age Nom;Age
 ---------------------------------------;​ ---------------------------------------;​
Ligne 206: Ligne 193:
 THEO;8 THEO;8
  
-The file has 8 lines </code>+The file has 8 lines </file>
  
-<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 221: Ligne 208:
 <code user> <code user>
 awk '/​THEO/​ { print $1, tolower($1) }' file.txt</​code>​ awk '/​THEO/​ { print $1, tolower($1) }' file.txt</​code>​
-<code+<file config retour de la commande>  
-THEO theo</code>+THEO theo</file>
  
 ==== int ==== ==== int ====
Ligne 229: Ligne 216:
 <code user> <code user>
 awk '/​CHLOE/​ { print $3, int($3/​5)}'​ file.txt</​code>​ awk '/​CHLOE/​ { print $3, int($3/​5)}'​ file.txt</​code>​
-<code+<file config retour de la commande>  
-12 2</code>+12 2</file>
  
 ==== printf ==== ==== printf ====
Ligne 236: Ligne 223:
 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 user> <code user>
-awk 'NR > 2 { printf "%10s %02d %-10s\n",​ $1,$3, $1}' file.txt +awk 'NR > 2 { printf "%10s %02d %-10s\n",​ $1,$3, $1}' file.txt</​code>​ 
 +<file config retour de la commande> ​
    ​CAMILLE 07 CAMILLE ​      ​CAMILLE 07 CAMILLE ​  
      CHLOE 12 CHLOE           CHLOE 12 CHLOE     
Ligne 243: Ligne 230:
    ​CLEMENT 07 CLEMENT ​      ​CLEMENT 07 CLEMENT ​  
       EMMA 06 EMMA      ​       EMMA 06 EMMA      ​
-      THEO 08 THEO </code>+      THEO 08 THEO </file>
  
 ==== length ==== ==== length ====
Ligne 250: Ligne 237:
 <code user> <code user>
 awk '/​CLEM/​ { print $1, length($1) }' file.txt</​code>​ awk '/​CLEM/​ { print $1, length($1) }' file.txt</​code>​
-<code+<file config retour de la commande>  
-CLEMENT 7</code>+CLEMENT 7</file>
  
 ==== match ==== ==== match ====
Ligne 258: Ligne 245:
 <code user> <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>+<file config retour de la commande
 CAMILLE 2 CAMILLE 2
 CHLOE 0 CHLOE 0
Ligne 264: Ligne 251:
 CLEMENT 0 CLEMENT 0
 EMMA 4 EMMA 4
-THEO 0</code>+THEO 0</file>
  
 ==== gsub ==== ==== gsub ====
Ligne 271: Ligne 258:
 <code user> <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>+<file config retour de la commande
 C_MILLE C_MILLE
 CHLOE CHLOE
Ligne 277: Ligne 264:
 CLEMENT CLEMENT
 EMM_ EMM_
-THEO</code>+THEO</file>
  
 ==== substr ==== ==== substr ====
Ligne 284: Ligne 271:
 <code user> <code user>
 awk '{ print $1, substr($1,​2,​3) }' file.txt</​code>​ awk '{ print $1, substr($1,​2,​3) }' file.txt</​code>​
-<code>+<file config retour de la commande
 Nom om Nom om
 --------------------------------------- --- --------------------------------------- ---
Ligne 292: Ligne 279:
 CLEMENT LEM CLEMENT LEM
 EMMA MMA EMMA MMA
-THEO HEO</code>+THEO HEO</file>
  
 ==== Fonctions utilisateur ==== ==== 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**. 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>​ +<​code ​awk prog.awk>
-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 296:
  
  
-        print \$1, \$3, gentag(\$1,\$3)+        print $1, $3, gentag($1,​$3)
 } }
  
Ligne 316: Ligne 302:
 print NR , "​lines"​ print NR , "​lines"​
 } }
-EOF 
 </​code>​ </​code>​
  
-<​code ​bash>+<​code ​user>
 awk -f prog.awk file.txt</​code>​ awk -f prog.awk file.txt</​code>​
-<code>+<file config retour de la commande
 Nom;​Age;​nom_Age Nom;​Age;​nom_Age
 ---------------------------------------;;​---_ ---------------------------------------;;​---_
Ligne 330: Ligne 315:
 EMMA;​6;​emm_6 EMMA;​6;​emm_6
 THEO;​8;​the_8 THEO;​8;​the_8
-8;​lines</​code>+8;​lines</​file>
  
 ===== Programmation ===== ===== Programmation =====
Ligne 339: Ligne 324:
  
 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 ​user prog_awk>​ +<​code ​awk prog.awk>
-cat > prog.awk ​<<EOF+
 BEGIN { BEGIN {
         OFS=","​         OFS=","​
Ligne 346: Ligne 330:
 NR <=2 { next } NR <=2 { next }
 { {
-        if ( \$3 < 11 ) {+        if ( $3 < 11 ) {
                 ecole="​primaire"​                 ecole="​primaire"​
         } else {         } else {
Ligne 352: Ligne 336:
         }         }
  
-        print \$1, ecole+        print $1, ecole
 } }
-EOF 
 </​code>​ </​code>​
  
 <code user> <code user>
 awk -f prog.awk file.txt</​code>​ awk -f prog.awk file.txt</​code>​
-<code>+<file config retour de la commande
 CAMILLE,​primaire CAMILLE,​primaire
 CHLOE,​college CHLOE,​college
Ligne 365: Ligne 348:
 CLEMENT,​primaire CLEMENT,​primaire
 EMMA,​primaire EMMA,​primaire
-THEO,​primaire</​code>+THEO,​primaire</​file>
  
-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 ​user prog_awk>​ +<​code ​awk prog.awk>
-cat > prog.awk ​<<EOF+
 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 384: Ligne 366:
         printf "​\n"​         printf "​\n"​
 } }
-EOF 
 </​code>​ </​code>​
  
 <code user> <code user>
 awk -f prog.awk file.txt</​code>​ awk -f prog.awk file.txt</​code>​
-<code>+<file config retour de la commande
 CAMILLE ​  ​....... CAMILLE ​  ​.......
 CHLOE     ​............ CHLOE     ​............
Ligne 395: Ligne 376:
 CLEMENT ​  ​....... CLEMENT ​  ​.......
 EMMA      ...... EMMA      ......
-THEO      ........</​code>+THEO      ........</​file>
  
 ==== Itérations ==== ==== Itérations ====
  
 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 ​user prog_awk>​ +<​code ​awk prog.awk>
-cat > prog.awk ​<<EOF+
 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"​
 } }
-EOF 
 </​code>​ </​code>​
  
 <code user> <code user>
 awk -f prog.awk file.txt</​code>​ awk -f prog.awk file.txt</​code>​
-<code>+<file config retour de la commande
 CAMILLE ​  ​....... CAMILLE ​  ​.......
 CHLOE     ​............ CHLOE     ​............
Ligne 421: Ligne 400:
 CLEMENT ​  ​....... CLEMENT ​  ​.......
 EMMA      ...... EMMA      ......
-THEO      ........</​code>+THEO      ........</​file>
  
 ==== Tableaux (Arrays) ==== ==== Tableaux (Arrays) ====
Ligne 431: Ligne 410:
  
 Calculer la moyenne d'âge des enfants par sexe : Calculer la moyenne d'âge des enfants par sexe :
-<​code ​user prog_awk>​ +<​code ​awk prog.awk>
-cat > prog.awk ​<<EOF+
  
         if ( NR <= 2 ) { next } # skip first 2 lines         if ( NR <= 2 ) { next } # skip first 2 lines
-        tab_age[\$2]+=\$3 +        tab_age[$2]+=$3 
-        tab_cpt[\$2]+++        tab_cpt[$2]++
 } }
 END {  END { 
Ligne 443: Ligne 421:
         }         }
 } }
-EOF 
 </​code>​ </​code>​
  
 <code user> <code user>
 awk -f prog.awk file.txt</​code>​ awk -f prog.awk file.txt</​code>​
-<code>+<file config retour de la commande
 F : Moy : 9 ans nb : 3 F : Moy : 9 ans nb : 3
-M : Moy : 7 ans nb : 3</code>+M : Moy : 7 ans nb : 3</file>
  
-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.1382890297.txt.gz · Dernière modification: 27/10/2013 17:11 par smolski

Pied de page des forums

Propulsé par FluxBB