Principe

 Extrait de Wikipédia :

Awk est le plus souvent utilisé pour la production de fichiers plats aux spécifications particulières (échanges entre différents systèmes d'informations hétérogènes). Il est aussi utilisé comme "parser" de fichiers XML ou de fichiers textes pour générer des commandes SQL à partir des données extraites. Il peut être utilisé aussi pour des opérations de calculs complexes et mise en forme de données brutes pour faire des tableaux statistiques.

On distingue awk, la commande originale, du new awk (nawk), arrivée un peu plus tard sur le marché. Les implémentations GNU de awk, sont en fait des new awk. On trouve en général la commande awk dans /usr/bin sous Unix. Certains systèmes GNU/Linux le mettent dans /bin. En général, elle est dans la variable d'environnement PATH. Cependant, on peut faire des scripts en awk et le shebang (#!/usr/bin/awk -f) devient faux. Le script est donc inutilisable si le binaire n’est pas là où on l’attend.

Il agit comme un filtre programmable prenant une série de lignes en entrée (sous forme de fichiers ou directement via l'entrée standard) et écrivant sur la sortie standard, qui peut être redirigée vers un autre fichier ou programme. Un programme Awk est composé de trois blocs distincts utilisables ou non pour le traitement d'un fichier (prétraitement, traitement, posttraitement). Awk lit sur l'entrée ligne par ligne, puis sélectionne (ou non) les lignes à traiter par des expressions rationnelles (et éventuellement des numéros de lignes). Une fois la ligne sélectionnée, elle est découpée en champs selon un séparateur d'entrée indiqué dans le programme awk par le symbole FS (qui par défaut correspond au caractère espace ou tabulation). Puis les différents champs sont disponibles dans des variables : $1 (premier champ), $2 (deuxième champ), $3 (troisième champ), ..., $NF (dernier champ).

« awk » est aussi l'extension de nom de fichier utilisée pour les scripts écrits dans ce langage.

Etiquettes: 

Syntaxe

awk [-F] '{action-awk}' [ fichier1 fichier2 ..... fichiern ]

awk [-F] -f script-awk [ fichier1 fichier2 ..... fichiern ]

La commande awk prend en argument la liste des fichiers à traiter. En l'absence de noms de fichiers sur la ligne de commande, awk travaille sur les données arrivant sur son entrée standard. Cette commande peut donc être placée derrière un tube de communication.

L'option "-F" permet d'initialiser, si besoin, la variable "FS" (Field Separator) correspondant au caractère séparateur de champ.

Etiquettes: 

Variables spéciales

Variables prédéfinies au lancement de awk

Le tableau suivant présente les principales variables internes du langage awk présentes en mémoire dès le lancement de la commande. La valeur de ces variables peut éventuellement être modifiée en fonction de la structure des données à traiter.

Nom de la variable Valeur par défaut Rôle de la variable
RS Newline (\n) Record Separator : Caractère séparateur d'enregistrement (lignes).
FS Suite d'espaces et/ou de tabulations Field Separator : Caractères séparateurs de champs.
OFS Espace Output Field Separator : Séparateur de champ utilisé pour l'affichage.
ORS Newline (\n) Output Record Separator : Caractère séparateur d'enregistrement en sortie.
ARGV - Tableau initialisé avec les arguments de la ligne de commande (options et nom du script awk exclus).
ARGC - Nombre d'éléments contenus dans le tableau ARGV.
ENVIRON Variables d'environnement exportées par le shell. Tableau contenant les variables d'environnement exportées par le shell.
CONVFMT %.6g Format de conversion des nombres en String.
OFMT %.6g Format de sortie des nombres.
SUBSEP \034 Caractère de séparation pour les routines internes des tableaux.

Par défaut, un enregistrement correspond donc à une ligne (suite de caractères terminée par "\n").

Lorsque la variable FS est initialisée avec un minimum de 2 caractères, cette valeur est interprétée comme une expression régulière.

Variables initialisées lors du traitement d'une ligne

Les enregistrements sont traités successivement. L'enregistrement courant est automatiquement découpé en champs et un certain nombre de variables internes awk sont initialisées. Le tableau suivant donne la liste des principales variables.

Nom de la variable Valeur de la variable
$0 Valeur de l'enregistrement courant
NF Number of Field : Nombre de champs de l'enregistrement courant.
$1, $2, ... $NF $1 contient la valeur du 1er champ, $2 la valeur du 2ème champ etc etc ... et $NF la valeur du dernier champ (NF est remplacé par sa valeur).
NR Number : Indice de l'enregistrement courant (NR vaut 1 quand la 1ère ligne est en cours de traitement, puis s'incrémente dès que awk change d'enregistrement).
FNR File Number : Indice de l'enregistrement courant relatif au fichier en cours de traitement.
FILENAME Nom du fichier en cours de traitement.
RLENGTH Longueur du string trouvé par la fonction match()
RSTART Première position du string trouvé par la fonction match()

Contrairement aux variables du shell, le symbole "$" des variables awk $1, $2 etc etc... fait partie du nom des variables.

Exemples simples

Premier exemple :

Ici, awk travaille sur le résultat de la commande ps -ef. La partie en rouge représente l'action que awk doit exécuter sur chaque ligne. Les simples quotes sont indispensables pour empêcher le shell d'interpréter les caractères destinés à la commande awk. Les instructions doivent être placées entre accolades. La fonction intégrée print va afficher à l'écran les champs 1 et 8 de chaque ligne.

$ ps -ef | awk '{print $1,$8}'
UID CMD
root init
...
www-data /usr/sbin/apache2
www-data /usr/sbin/apache2
root vzctl:
root -bash
postfix pickup
root ps
root awk
root /usr/lib/postfix/master
postfix qmgr
$

Deuxième exemple :

La fonction print peut également recevoir des chaines de caractères en argument.

$ ps -ef | awk '{print "User : " , $1, "\tCommande : " , $8}'
User :  UID     Commande :  CMD
User :  root    Commande :  init
User :  root    Commande :  [kthreadd/113]
User :  root    Commande :  [khelper/113]
User :  root    Commande :  [init-logger]
...
User :  root    Commande :  vzctl:
User :  root    Commande :  -bash
User :  root    Commande :  ps
User :  root    Commande :  awk
User :  root    Commande :  /usr/lib/postfix/master
$

\t représente le caractère tabulation.

Troisième exemple :

Modification du séparateur de champ "FS" grâce à l'option "-F"

$ cat /etc/passwd | awk -F : '{print $1,$7}'
root /bin/bash
...
nobody /bin/sh
libuuid /bin/sh
postfix /bin/false
sshd /usr/sbin/nologin
mysql /bin/false
$

Quatrième exemple :

$ cat /etc/passwd | awk -F : '{print "User : " , $1 , "\tShell : " , $7}'
User :  root    Shell :  /bin/bash
User :  daemon  Shell :  /bin/sh
User :  bin     Shell :  /bin/sh
User :  sys     Shell :  /bin/sh
User :  sync    Shell :  /bin/sync
User :  games   Shell :  /bin/sh
User :  man     Shell :  /bin/sh
User :  lp      Shell :  /bin/sh
User :  mail    Shell :  /bin/sh
User :  news    Shell :  /bin/sh
User :  uucp    Shell :  /bin/sh
User :  proxy   Shell :  /bin/sh
User :  www-data        Shell :  /bin/sh
User :  backup  Shell :  /bin/sh
User :  list    Shell :  /bin/sh
User :  irc     Shell :  /bin/sh
User :  gnats   Shell :  /bin/sh
User :  nobody  Shell :  /bin/sh
User :  libuuid         Shell :  /bin/sh
User :  postfix         Shell :  /bin/false
User :  sshd    Shell :  /usr/sbin/nologin
User :  mysql   Shell :  /bin/false
$

Si la fonction print ne reçoit pas d'argument, elle affiche $0.

$ cat /etc/passwd | awk -F : '{print}'
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
postfix:x:101:104::/var/spool/postfix:/bin/false
sshd:x:102:65534::/var/run/sshd:/usr/sbin/nologin
mysql:x:103:108:MySQL Server,,,:/var/lib/mysql:/bin/false
$

Etiquettes: 

Critères de sélection

Il est possible de sélectionner les enregistrements sur lesquels l'action doit être exécutée.

Syntaxe :

awk [-F] 'critère {action-awk}' [fichier1 fichier2 ... fichiern]

Le critère de sélection peut s'exprimer de différentes manières.

Expressions régulières

Les enregistrements à traiter peuvent être sélectionnés en utilisant les expressions régulières étendues (ERe).

Attention, pour utiliser les quantificateurs {x,y} d'une ERe, il faut utiliser awk avec l'option --posix

Premier exemple :

Afficher les lignes du fichier /etc/passwd contenant /bin/false

$ awk -F':' '/\/bin\/false/ {print $0}' /etc/passwd
postfix:x:101:104::/var/spool/postfix:/bin/false
mysql:x:103:108:MySQL Server,,,:/var/lib/mysql:/bin/false
$

Par défaut, le critère est mis en correspondance avec $0.

Il est possible de mettre un champ particulier en correspondance avec une expression régulière. Dans ce cas, il faut utiliser l'opérateur de concordance "~" ou de non-concordance "!~".

Deuxième exemple :

Afficher les lignes du fichier /etc/passwd dont le 6ème champ commence par /usr.

$ awk -F':' '$6 ~ /^\/usr/ {print $0}' /etc/passwd
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
games:x:5:60:games:/usr/games:/bin/sh
$

Et à l'inverse

$ awk -F':' '$6 !~ /^\/usr/ {print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:2:2:bin:/bin:/bin/sh
...
postfix:x:101:104::/var/spool/postfix:/bin/false
sshd:x:102:65534::/var/run/sshd:/usr/sbin/nologin
mysql:x:103:108:MySQL Server,,,:/var/lib/mysql:/bin/false
$

Tests logiques

Le critère peut être une expression d'opérateurs et renvoyant la valeur de vérité vrai ou faux.

Opérateurs de tests courants

Opérateur Signification
< Inférieur
> Supérieur
<= Inférieur ou égal
>= Supérieur ou égal
== Test d'égalité
!= Test d'inégalité
~ Correspondance avec une expression régulière
!~ Non-correspondance avec une expression régulière
! Négation
&& Et logique
|| Ou logique
(expression) Regroupement

Exemple :

Afficher les champs 1 et 7 de la ligne 4 et 8 du fichier /etc/passwd

$ awk -F':' 'NR == 4 || NR == 8 {print $1,"==>",$7}' /etc/passwd
sys ==> /bin/sh
lp ==> /bin/sh
$

Le chiffre 0 et la chaîne vide sont des valeurs fausses. Toute autre valeur est vraie.

Afficher uniquement les lignes impaires du fichier /etc/passwd.

Le résultat de l'opération NR%2 représentant le reste de la division par 2 du numéro de ligne en cours de traitement, cela permet d'afficher uniquement les lignes impaires du fichier car seulement les nombres impairs renvoient un reste de division différent de 0 (donc vrai). Equivalent à NR%2!=0

$ nl /etc/passwd
     1  root:x:0:0:root:/root:/bin/bash
     2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh
     3  bin:x:2:2:bin:/bin:/bin/sh
     4  sys:x:3:3:sys:/dev:/bin/sh
     5  sync:x:4:65534:sync:/bin:/bin/sync
     6  games:x:5:60:games:/usr/games:/bin/sh
     7  man:x:6:12:man:/var/cache/man:/bin/sh
     8  lp:x:7:7:lp:/var/spool/lpd:/bin/sh
     9  mail:x:8:8:mail:/var/mail:/bin/sh
    10  news:x:9:9:news:/var/spool/news:/bin/sh
    11  uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
    12  proxy:x:13:13:proxy:/bin:/bin/sh
    13  www-data:x:33:33:www-data:/var/www:/bin/sh
    14  backup:x:34:34:backup:/var/backups:/bin/sh
    15  list:x:38:38:Mailing List Manager:/var/list:/bin/sh
    16  irc:x:39:39:ircd:/var/run/ircd:/bin/sh
    17  gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
    18  nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
    19  libuuid:x:100:101::/var/lib/libuuid:/bin/sh
    20  postfix:x:101:104::/var/spool/postfix:/bin/false
    21  sshd:x:102:65534::/var/run/sshd:/usr/sbin/nologin
    22  mysql:x:103:108:MySQL Server,,,:/var/lib/mysql:/bin/false
$

$ awk -F':' 'NR%2 {print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:2:2:bin:/bin:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
sshd:x:102:65534::/var/run/sshd:/usr/sbin/nologin
$

A l'inverse, afficher uniquement les lignes paires.

$ awk -F':' 'NR%2==0 {print $0}' /etc/passwd
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
games:x:5:60:games:/usr/games:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
postfix:x:101:104::/var/spool/postfix:/bin/false
mysql:x:103:108:MySQL Server,,,:/var/lib/mysql:/bin/false
$

Afficher les champs 1 et 7 de la ligne 4 à 8 du fichier /etc/passwd

$ awk -F':' 'NR == 4 , NR == 8 {print $1,"==>",$7}' /etc/passwd
sys ==> /bin/sh
sync ==> /bin/sync
games ==> /bin/sh
man ==> /bin/sh
lp ==> /bin/sh
$

Etiquettes: 

Structure d'un script awk

Lorsqu'il y a un certain nombre d'actions à réaliser sur les données, il est plus confortable d'écrire un script awk. Un script awk peut contenir une section BEGIN, une section END, et 0 à x sections intermédiaires. Toute section est facultative.

BEGIN

La section BEGIN est exécutée avant le traitement du premier enregistrement des données. Elle est utilisée essentiellement pour initialiser le contexte d'exécution.

Sections intermédiaires

Il peut y avoir plusieurs sections intermédiaires qui seront exécutées sur chaque enregistrement.

END

La section END est exécutée après le traitement du dernier enregistrement des données. Elle est utilisée pour exploiter les résultats issus du traitement des données.

Commentaires

Un commentaire commence par le caractère "#" et se termine au caractère "\n" (fin de la ligne).

Variables

Des variables personnelles peuvent être créées. Une variable est définie dès qu'elle est initialisée et n'a pas besoin d'être typée. L'utilisation d'une variable qui n'a jamais été définie a pour valeur 0 dans un contexte numérique et chaine vide dans un contexte de chaine.

Exemple :

$ nl script1.awk
     1  # Section BEGIN
     2  BEGIN {
     3          print "Section BEGIN"
     4          nb_0=0
     5          nb_1=0
     6          nb_2=0
     7          nb_3=0
     8          nb_4=0
     9          nb_5=0
    10          nb_6=0
    11          nb_7=0
    12          nb_8=0
    13          nb_9=0
    14  }
    15  # Section intermediaire
    16  # Traitement des departements commancant par 0
    17  $2 ~ /^0/ {
    18          print "Departement commancant par 0 ==> CP : " , $3 , "DEPT : " , $5
    19          nb_0+=1
    20  }
    21  # Section intermediaire
    22  # Traitement des departements commancant par 1
    23  $2 ~ /^1/ {
    24          print "Departement commancant par 1 ==> CP : " , $3 , "DEPT : " , $5
    25          nb_1+=1
    26  }
    27  # Section intermediaire
    28  # Traitement des departements commancant par 2
    29  $2 ~ /^2/ {
    30          print "Departement commancant par 2 ==> CP : " , $3 , "DEPT : " , $5
    31          nb_2+=1
    32  }
    33  # Section intermediaire
    34  # Traitement des departements commancant par 3
    35  $2 ~ /^3/ {
    36          print "Departement commancant par 3 ==> CP : " , $3 , "DEPT : " , $5
    37          nb_3+=1
    38  }
    39  # Section intermediaire
    40  # Traitement des departements commancant par 4
    41  $2 ~ /^4/ {
    42          print "Departement commancant par 4 ==> CP : " , $3 , "DEPT : " , $5
    43          nb_4+=1
    44  }
    45  # Section intermediaire
    46  # Traitement des departements commancant par 5
    47  $2 ~ /^5/ {
    48          print "Departement commancant par 5 ==> CP : " , $3 , "DEPT : " , $5
    49          nb_5+=1
    50  }
    51  # Section intermediaire
    52  # Traitement des departements commancant par 6
    53  $2 ~ /^6/ {
    54          print "Departement commancant par 6 ==> CP : " , $3 , "DEPT : " , $5
    55          nb_6+=1
    56  }
    57  # Section intermediaire
    58  # Traitement des departements commancant par 7
    59  $2 ~ /^7/ {
    60          print "Departement commancant par 7 ==> CP : " , $3 , "DEPT : " , $5
    61          nb_7+=1
    62  }
    63  # Section intermediaire
    64  # Traitement des departements commancant par 8
    65  $2 ~ /^8/ {
    66          print "Departement commancant par 8 ==> CP : " , $3 , "DEPT : " , $5
    67          nb_8+=1
    68  }
    69  # Section intermediaire
    70  # Traitement des departements commancant par 9
    71  $2 ~ /^9/ {
    72          print "Departement commancant par 9 ==> CP : " , $3 , "DEPT : " , $5
    73          nb_9+=1
    74  }
    75  # Section END
    76  END {
    77          print "Section END"
    78          print "Nombre total de lignes : " , NR
    79          print "Nombre de departements commencant par 0 : " , nb_0
    80          print "Nombre de departements commencant par 1 : " , nb_1
    81          print "Nombre de departements commencant par 2 : " , nb_2
    82          print "Nombre de departements commencant par 3 : " , nb_3
    83          print "Nombre de departements commencant par 4 : " , nb_4
    84          print "Nombre de departements commencant par 5 : " , nb_5
    85          print "Nombre de departements commencant par 6 : " , nb_6
    86          print "Nombre de departements commencant par 7 : " , nb_7
    87          print "Nombre de departements commencant par 8 : " , nb_8
    88          print "Nombre de departements commencant par 9 : " , nb_9
    89  }
$

Section BEGIN

Initialisation des variables personnelles servant de compteur.

Sections intermédiaires

Exécution des traitements spécifiques en fonction du début du numéro des départements.

Section END

Affichage du nombre total de lignes traitées et du nombre de départements regroupés par dizaine du numéro de départements.

Exécution du script

$ awk -f script1.awk depts2012.txt
Section BEGIN
Departement commancant par 0 ==> CP :  01053 DEPT :  AIN
Departement commancant par 0 ==> CP :  02408 DEPT :  AISNE
Departement commancant par 0 ==> CP :  03190 DEPT :  ALLIER
Departement commancant par 0 ==> CP :  04070 DEPT :  ALPES-DE-HAUTE-PROVENCE
Departement commancant par 0 ==> CP :  05061 DEPT :  HAUTES-ALPES
Departement commancant par 0 ==> CP :  06088 DEPT :  ALPES-MARITIMES
Departement commancant par 0 ==> CP :  07186 DEPT :  ARDECHE
Departement commancant par 0 ==> CP :  08105 DEPT :  ARDENNES
Departement commancant par 0 ==> CP :  09122 DEPT :  ARIEGE
Departement commancant par 1 ==> CP :  10387 DEPT :  AUBE
Departement commancant par 1 ==> CP :  11069 DEPT :  AUDE
Departement commancant par 1 ==> CP :  12202 DEPT :  AVEYRON
Departement commancant par 1 ==> CP :  13055 DEPT :  BOUCHES-DU-RHONE
Departement commancant par 1 ==> CP :  14118 DEPT :  CALVADOS
Departement commancant par 1 ==> CP :  15014 DEPT :  CANTAL
Departement commancant par 1 ==> CP :  16015 DEPT :  CHARENTE
Departement commancant par 1 ==> CP :  17300 DEPT :  CHARENTE-MARITIME
Departement commancant par 1 ==> CP :  18033 DEPT :  CHER
Departement commancant par 1 ==> CP :  19272 DEPT :  CORREZE
Departement commancant par 2 ==> CP :  2A004 DEPT :  CORSE-DU-SUD
Departement commancant par 2 ==> CP :  2B033 DEPT :  HAUTE-CORSE
Departement commancant par 2 ==> CP :  21231 DEPT :  COTE-D'OR
Departement commancant par 2 ==> CP :  22278 DEPT :  COTES-D'ARMOR
Departement commancant par 2 ==> CP :  23096 DEPT :  CREUSE
Departement commancant par 2 ==> CP :  24322 DEPT :  DORDOGNE
Departement commancant par 2 ==> CP :  25056 DEPT :  DOUBS
Departement commancant par 2 ==> CP :  26362 DEPT :  DROME
Departement commancant par 2 ==> CP :  27229 DEPT :  EURE
Departement commancant par 2 ==> CP :  28085 DEPT :  EURE-ET-LOIR
Departement commancant par 2 ==> CP :  29232 DEPT :  FINISTERE
Departement commancant par 3 ==> CP :  30189 DEPT :  GARD
Departement commancant par 3 ==> CP :  31555 DEPT :  HAUTE-GARONNE
Departement commancant par 3 ==> CP :  32013 DEPT :  GERS
Departement commancant par 3 ==> CP :  33063 DEPT :  GIRONDE
Departement commancant par 3 ==> CP :  34172 DEPT :  HERAULT
Departement commancant par 3 ==> CP :  35238 DEPT :  ILLE-ET-VILAINE
Departement commancant par 3 ==> CP :  36044 DEPT :  INDRE
Departement commancant par 3 ==> CP :  37261 DEPT :  INDRE-ET-LOIRE
Departement commancant par 3 ==> CP :  38185 DEPT :  ISERE
Departement commancant par 3 ==> CP :  39300 DEPT :  JURA
Departement commancant par 4 ==> CP :  40192 DEPT :  LANDES
Departement commancant par 4 ==> CP :  41018 DEPT :  LOIR-ET-CHER
Departement commancant par 4 ==> CP :  42218 DEPT :  LOIRE
Departement commancant par 4 ==> CP :  43157 DEPT :  HAUTE-LOIRE
Departement commancant par 4 ==> CP :  44109 DEPT :  LOIRE-ATLANTIQUE
Departement commancant par 4 ==> CP :  45234 DEPT :  LOIRET
Departement commancant par 4 ==> CP :  46042 DEPT :  LOT
Departement commancant par 4 ==> CP :  47001 DEPT :  LOT-ET-GARONNE
Departement commancant par 4 ==> CP :  48095 DEPT :  LOZERE
Departement commancant par 4 ==> CP :  49007 DEPT :  MAINE-ET-LOIRE
Departement commancant par 5 ==> CP :  50502 DEPT :  MANCHE
Departement commancant par 5 ==> CP :  51108 DEPT :  MARNE
Departement commancant par 5 ==> CP :  52121 DEPT :  HAUTE-MARNE
Departement commancant par 5 ==> CP :  53130 DEPT :  MAYENNE
Departement commancant par 5 ==> CP :  54395 DEPT :  MEURTHE-ET-MOSELLE
Departement commancant par 5 ==> CP :  55029 DEPT :  MEUSE
Departement commancant par 5 ==> CP :  56260 DEPT :  MORBIHAN
Departement commancant par 5 ==> CP :  57463 DEPT :  MOSELLE
Departement commancant par 5 ==> CP :  58194 DEPT :  NIEVRE
Departement commancant par 5 ==> CP :  59350 DEPT :  NORD
Departement commancant par 6 ==> CP :  60057 DEPT :  OISE
Departement commancant par 6 ==> CP :  61001 DEPT :  ORNE
Departement commancant par 6 ==> CP :  62041 DEPT :  PAS-DE-CALAIS
Departement commancant par 6 ==> CP :  63113 DEPT :  PUY-DE-DOME
Departement commancant par 6 ==> CP :  64445 DEPT :  PYRENEES-ATLANTIQUES
Departement commancant par 6 ==> CP :  65440 DEPT :  HAUTES-PYRENEES
Departement commancant par 6 ==> CP :  66136 DEPT :  PYRENEES-ORIENTALES
Departement commancant par 6 ==> CP :  67482 DEPT :  BAS-RHIN
Departement commancant par 6 ==> CP :  68066 DEPT :  HAUT-RHIN
Departement commancant par 6 ==> CP :  69123 DEPT :  RHONE
Departement commancant par 7 ==> CP :  70550 DEPT :  HAUTE-SAONE
Departement commancant par 7 ==> CP :  71270 DEPT :  SAONE-ET-LOIRE
Departement commancant par 7 ==> CP :  72181 DEPT :  SARTHE
Departement commancant par 7 ==> CP :  73065 DEPT :  SAVOIE
Departement commancant par 7 ==> CP :  74010 DEPT :  HAUTE-SAVOIE
Departement commancant par 7 ==> CP :  75056 DEPT :  PARIS
Departement commancant par 7 ==> CP :  76540 DEPT :  SEINE-MARITIME
Departement commancant par 7 ==> CP :  77288 DEPT :  SEINE-ET-MARNE
Departement commancant par 7 ==> CP :  78646 DEPT :  YVELINES
Departement commancant par 7 ==> CP :  79191 DEPT :  DEUX-SEVRES
Departement commancant par 8 ==> CP :  80021 DEPT :  SOMME
Departement commancant par 8 ==> CP :  81004 DEPT :  TARN
Departement commancant par 8 ==> CP :  82121 DEPT :  TARN-ET-GARONNE
Departement commancant par 8 ==> CP :  83137 DEPT :  VAR
Departement commancant par 8 ==> CP :  84007 DEPT :  VAUCLUSE
Departement commancant par 8 ==> CP :  85191 DEPT :  VENDEE
Departement commancant par 8 ==> CP :  86194 DEPT :  VIENNE
Departement commancant par 8 ==> CP :  87085 DEPT :  HAUTE-VIENNE
Departement commancant par 8 ==> CP :  88160 DEPT :  VOSGES
Departement commancant par 8 ==> CP :  89024 DEPT :  YONNE
Departement commancant par 9 ==> CP :  90010 DEPT :  TERRITOIRE
Departement commancant par 9 ==> CP :  91228 DEPT :  ESSONNE
Departement commancant par 9 ==> CP :  92050 DEPT :  HAUTS-DE-SEINE
Departement commancant par 9 ==> CP :  93008 DEPT :  SEINE-SAINT-DENIS
Departement commancant par 9 ==> CP :  94028 DEPT :  VAL-DE-MARNE
Departement commancant par 9 ==> CP :  95500 DEPT :  VAL-D'OISE
Departement commancant par 9 ==> CP :  97105 DEPT :  GUADELOUPE
Departement commancant par 9 ==> CP :  97209 DEPT :  MARTINIQUE
Departement commancant par 9 ==> CP :  97302 DEPT :  GUYANE
Departement commancant par 9 ==> CP :  97411 DEPT :  LA
Departement commancant par 9 ==> CP :  97608 DEPT :  MAYOTTE
Section END
Nombre total de lignes :  102
Nombre de departements commencant par 0 :  9
Nombre de departements commencant par 1 :  10
Nombre de departements commencant par 2 :  11
Nombre de departements commencant par 3 :  10
Nombre de departements commencant par 4 :  10
Nombre de departements commencant par 5 :  10
Nombre de departements commencant par 6 :  10
Nombre de departements commencant par 7 :  10
Nombre de departements commencant par 8 :  10
Nombre de departements commencant par 9 :  11
$

Etiquettes: