Tableaux

Dans le langage awk, il existe 2 types de tableaux

Etiquettes: 

Tableaux indicés par un entier

L'indice de départ est au choix.

Exemple

Traitement du fichier /etc/passwd.
Ligne 2, initialisation de la variable FS.
Ligne 5, le contenu de la variable $1 correspondant au user est stocké dans le tableau user[] indicé à partir de 1.
Ligne 8 à 10, on parcourt le tableau et on affiche le contenu en formatant l'affichage avec printf.

$ nl script5.awk
     1  BEGIN {
     2          FS=":"
     3  }
     4  {
     5          user[NR]=$1
     6  }
     7  END {
     8          for (indice = 1 ; indice <= NR ; indice++ ) {
     9                  printf ("User num %2d : %-20s\n" , indice , user[indice]) ;
    10          }
    11  }

Exécution

$ awk -f script5.awk /etc/passwd
User num  1 : root
User num  2 : daemon
User num  3 : bin
User num  4 : sys
User num  5 : sync
User num  6 : games
User num  7 : man
User num  8 : lp
User num  9 : mail
User num 10 : news
User num 11 : uucp
User num 12 : proxy
User num 13 : www-data
User num 14 : backup
User num 15 : list
User num 16 : irc
User num 17 : gnats
User num 18 : nobody
User num 19 : libuuid
User num 20 : postfix
User num 21 : sshd
User num 22 : mysql
$

Etiquettes: 

Tableaux associatifs

Initialiser un tableau

Les tableaux associatifs ont leurs éléments indicés par une chaine de caractères. Cet indice alphanumérique est considéré comme la clé et l'élément correspondant est nommé valeur.

Exemple

Le fichier depts2012.txt liste tous les départements par numéro de région.

$ cat depts2012.txt
REGION  DEP     CHEFLIEU        TNCC    NCC     NCCENR
82      01      01053   5       AIN     Ain
22      02      02408   5       AISNE   Aisne
83      03      03190   5       ALLIER  Allier
93      04      04070   4       ALPES-DE-HAUTE-PROVENCE Alpes-de-Haute-Provence
93      05      05061   4       HAUTES-ALPES    Hautes-Alpes
93      06      06088   4       ALPES-MARITIMES Alpes-Maritimes
82      07      07186   5       ARDECHE Ardèche
21      08      08105   4       ARDENNES        Ardennes
...
11      95      95500   2       VAL-D'OISE      Val-d'Oise
01      971     97105   3       GUADELOUPE      Guadeloupe
02      972     97209   3       MARTINIQUE      Martinique
03      973     97302   3       GUYANE  Guyane
04      974     97411   0       LA REUNION      La Réunion
06      976     97608   0       MAYOTTE Mayotte
$

Le script suivant doit compter le nombre de départements qu'il y a par numéro de région.
La section BEGIN est vide car il n'y a pas besoin d'initialiser des variables.
Ligne 3, une condition est renseignée afin de ne pas traiter la première ligne du fichier qui correspond aux en-têtes.
Ligne 4, mise à jour du tableau nbdepts[] ayant comme clé la valeur du premier champ correspondant au numéro de la région et incrémenté de 1 à chaque fois que le champ 1 de la ligne traitée correspond à la clé.
Ligne 7 à 9, on parcourt le tableau et on affiche les résultats.

$ nl script6.awk
     1  BEGIN {
     2  }
     3  NR != 1{
     4          nbdepts[$1]+=1
     5  }
     6  END {
     7          for ( region in nbdepts) {
     8                  printf("Region num : %02d ==> %3d departement(s)\n" , region , nbdepts[region])
     9          }
    10  }
$

Exécution

$ awk -f script6.awk depts2012.txt
Region num : 01 ==>   1 departement(s)
Region num : 02 ==>   1 departement(s)
Region num : 03 ==>   1 departement(s)
Region num : 04 ==>   1 departement(s)
Region num : 11 ==>   8 departement(s)
Region num : 06 ==>   1 departement(s)
Region num : 21 ==>   4 departement(s)
Region num : 22 ==>   3 departement(s)
Region num : 23 ==>   2 departement(s)
Region num : 31 ==>   2 departement(s)
Region num : 24 ==>   6 departement(s)
Region num : 25 ==>   3 departement(s)
Region num : 26 ==>   4 departement(s)
Region num : 41 ==>   4 departement(s)
Region num : 42 ==>   2 departement(s)
Region num : 43 ==>   4 departement(s)
Region num : 52 ==>   5 departement(s)
Region num : 53 ==>   4 departement(s)
Region num : 54 ==>   4 departement(s)
Region num : 72 ==>   5 departement(s)
Region num : 73 ==>   8 departement(s)
Region num : 74 ==>   3 departement(s)
Region num : 82 ==>   8 departement(s)
Region num : 83 ==>   4 departement(s)
Region num : 91 ==>   5 departement(s)
Region num : 93 ==>   6 departement(s)
Region num : 94 ==>   2 departement(s)
$

Tester l'existence d'un élément

Le mot clé in permet de tester l'existence d'une clé dans un tableau associatif. Cette expression retourne vrai si la clé est présente, faux dans le cas contraire.

cle in tableau

Cette expression peut donc être utilisée comme condition d'une structure de contrôle.

if ( cle in tableau ) {
     ...
     ...
}

Supprimer un élément

Il est possible de supprimer un élément d'un tableau associatif en utilisant la syntaxe suivante.

delete tableau[cle]

La paire clé-valeur est supprimée.

Etiquettes: