Valid XHTML     Valid CSS2    

Langages de scripts, automatisation de commandes et

production de documents structurés :

2. Les précurseurs : Awk et Rexx

                     gilles.hunault "at" univ-angers.fr

 

Table des matières cliquable

  1. AWK : compter les lignes d'un seul fichier

  2. AWK : compter les fichiers par extension

  3. AWK : créer les fichiers dictionnaires d'un texte

  4. REXX : commandes en session interactive

  5. REXX : implémenter range un peu comme en python

  6. REXX : exécuter le même programme AWK sur un ensemble de fichiers

  7. REXX : archivage incrémental de fichiers XML

  8. REXX : que font ces programmes ?

  9. REXX : fichiers dictionnaires d'un texte

 

Il est possible d'afficher toutes les solutions via ?solutions=1.

 

1. AWK : compter les lignes d'un seul fichier

La commande wc d'Unix, avec l'option -l permet de connaitre le nombre de lignes d'un ou plusieurs fichiers, comme le montre la commande suivante :


     $gh> wc -l demo*.txt
     
       75 demo1_res.txt
        9 demo1.txt
       40 demo_perl.txt
      100 demo_php.txt
       61 demo_rexx.txt
       75 demo_r.txt
      360 total
     

On voudrait la compléter pour indiquer le nombre de mots moyen par ligne, avec le nombre minimal et maximal de mots. Ainsi, on disposera d'un moyen pour tester si toutes les lignes ont le même nombre de mots. Implémenter un programme AWK qui calcule ces valeurs en plus du nombre de lignes. On devra l'exécuter par la commande gawk -f nblv1.awk fichier mais pour un seul fichier de données. Quel est le défaut de cet appel de programme ? Comment avoir un "help" de ce programme ? On rappelle que pour AWK la variable FNR correspond au numéro de ligne courant dans le fichier, NF au nombre de mots de la ligne courante et FILENAME au nom du fichier. Que se passe-t-il si au lieu d'un seul fichier on utilise une notation ambigue ? Voici un exemple de ce qu'on voudrait obtenir (les espaces et le formatage font partie de l'affichage, voir exercice 6) :


     $gh> gawk -f nblv1.awk demo1_res.txt
         demo1_res.txt                     75 ligne(s) NFmoyen     3.23 NFmin    0 NFmax   15*
     

On pourra se contenter dans un premier temps de ne calculer que le nombre moyen de mots, affiché avec deux décimales.

Solution :  

 

2. AWK : compter les fichiers par extension

On aimerait connaitre le nombre de fichiers par extension, avec la taille qu'ils occupent. Ecrire un programme Awk pour réaliser cela. Voici un exemple de ce qu'on voudrait obtenir pour notre répertoire courant (affichage trié) :


     ---  ext            nb_fich        cumul_taille (kO)
          2012               1                1
          aux                1                0
          awk               13                9
          awk_AIDE           1                0
          b                  1                0
          css                1                0
          dac                1                0
          dsc                1                7
          dvi                1                1
          gal                1                0
          gif                2                0
          htm                1                6
          html               2                0
          html.old           1                0
          jpg                4             2028
          js                 2               19
          log                1                6
          m1                 1                1
          ngr                1                0
          noacc              1                0
          ocd                1                0
          ocm                1                0
          pdf                1               11
          personnes          1                0
          php               19              173
          php.old            7              105
          pl                 6               24
          pl.old             1                9
          png               16             1685
          ps                 1               80
          py                 7               18
          pyc                1                0
          r                  2              494
          rb                 1                0
          rex               15               47
          rnc                1                2
          rtf                1               11
          sedit              2                3
          sh                 1                0
          sor                2               12
          tar                2               20
          tcl                3               21
          tex                1                1
          tk                 1                1
          tmp                1                0
          txt               69             1060
          xml                2                1
          zip                1             4240
          soit en tout     208 fichiers et    9.88 Mo
     

Solution :  

 

3. AWK : créer les fichiers dictionnaires d'un texte

On aimerait construirer les dictionnaires alphabétiques et fréquentiels du fichier texte.txt dont le contenu est :


     Ceci est un petit texte dont le but
     est de tester la création de dictionnaires
     avec un langage de script.
     
     C'est pourquoi il est court -- et peu intéressant ! --
     mais c'est un fichier pratique ; on conserva les accents
     tels quels.
     

Voici ce qu'on voudrait obtenir comme dictionnaire alphabétique, soit le fichier dico.tpm :


     C                                             1
     Ceci                                          1
     accents                                       1
     avec                                          1
     but                                           1
     c                                             1
     conserva                                      1
     court                                         1
     création                                      1
     de                                            3
     dictionnaires                                 1
     dont                                          1
     est                                           5
     et                                            1
     fichier                                       1
     il                                            1
     intéressant                                   1
     la                                            1
     langage                                       1
     le                                            1
     les                                           1
     mais                                          1
     on                                            1
     petit                                         1
     peu                                           1
     pourquoi                                      1
     pratique                                      1
     quels                                         1
     script                                        1
     tels                                          1
     tester                                        1
     texte                                         1
     un                                            3
     

Et voici ce qu'on voudrait obtenir comme dictionnaire fréquentiel, soit le fichier dico.tpo. Il faut donc trier ici par fréquence décroissante puis par ordre alphabétique croissant en cas d'exaequo :


     est                                           5
     de                                            3
     un                                            3
     C                                             1
     Ceci                                          1
     accents                                       1
     avec                                          1
     but                                           1
     c                                             1
     conserva                                      1
     court                                         1
     création                                      1
     dictionnaires                                 1
     dont                                          1
     et                                            1
     fichier                                       1
     il                                            1
     intéressant                                   1
     la                                            1
     langage                                       1
     le                                            1
     les                                           1
     mais                                          1
     on                                            1
     petit                                         1
     peu                                           1
     pourquoi                                      1
     pratique                                      1
     quels                                         1
     script                                        1
     tels                                          1
     tester                                        1
     texte                                         1
     

Solution :  

 

4. REXX : commandes en session interactive

En mode interactif, avec rt.rex donner la ou les instructions qui répondent aux questions suivantes :

  • quelle est la valeur de 16 puissance 4 ? et le reste entier de la division de 2012 par 128 ?

  • quel est le code hexadécimal de A  ? et le code décimal de 'xFFF'  ? et le code ascii de 'a' ? et le caractère de numéro décimal 98 ?

  • si la variable cmd contient "prog --fmt tex --nbdec 4 --fichier demo.rex" comment récupérer la valeur de l'option --fmt c'est-à-dire tex ?

  • si phr contient "A2837 12 18 37 25" comment transférer dans la variable numData toutes les valeurs après le premier mot (soit ici A2837) ?

  • combien vaut factorielle 8 ?

  • comment afficher ou mettre dans une variable la date et l'heure ?

  • comment calculer la moyenne des valeurs contenues dans la chaine de caractères "12 5 20 8 15" ?

  • comment souligner avec des tirets la chaine de caractères "ceci est mon titre" ?

Solution :  

 

5. REXX : implémenter range un peu comme en python

Implémenter une fonction range() en REXX un peu comme Python, mais en commençant à l'indice 1. On viendra compléter le fichier range.rex suivant qui indique ce qu'on veut obtenir :


     /*  (gH)   -_-  range.rex  ;  TimeStamp (unix) : 18 Novembre 2012 vers 10:40 */
     
     /* implémentation de la fonction range de python en rexx */
     
     a = range(5)        /* doit renvoyer 1 2 3 4 5 */
     say a
     
     say range(10,15)    /* doit afficher 10 11 12 13 14 15 */
     
     say range(10,20,4)  /* doit afficher 10 14 18 */
     
     

Solution :  

 

6. REXX : exécuter le même programme AWK sur un ensemble de fichiers

Reprendre l'exercice 1. On utilisera REXX pour afficher un "help" si on ne fournit aucun paramètre ; sinon, on exécutera la commande gawk -f nblv2.awk sur chacun des fichiers passés en paramètre (notation ambigue avec * et ? possible).

Solution :  

 

7. REXX : archivage incrémental de fichiers XML

On voudrait qu'à l'exécution du script archcd.rex il y ait une production automatique de l'archive pour tous les fichiers de type xml avec numérotation de l'archive. Par exemple la première fois que le script est exécuté, on produira l'archive lesxml001.tar ; la seconde fois, ce sera lesxml002.tar etc. L'algorithme de base ressemble certainement à


      # algorithme d'archivage en .tar des *.xml
     
         affecter numarchive <-- 1
         construire nomarchive à partir de numarchive
     
         tant_que le fichier nomarchive existe
             affecter numarchive <-- numarchive + 1
             construire nomarchive à partir de numarchive
         fin tant_que le fichier nomarchive existe
     
         exécuter la commande tar pour les fichiers indiqués
         afficher un message indiquant que l'archivage est fait
     

On pourra utiliser REXXUT et FILEUT.

Solution :  

 

8. REXX : que font ces programmes ?

Que fait le programme REXX nommé catv.rex ? Et les macros pour éditeur av.sedit, ts.sedit et exec.sedit ?

Solution :  

 

9. REXX : fichiers dictionnaires d'un texte

Essayer de réaliser l'exercice 3 proposé pour AWK (création des dictionnaires) en REXX.

Solution :  

 

 

Code-source php de cette page ; code javascript utilisé. Retour à la page principale du cours.

 

 

retour gH    Retour à la page principale de   (gH)