[gull] AWK: associative array

pierre maitre maitre at cdg.ch
Tue Dec 30 20:39:02 CET 2003


Bonsoir à tous

Je butte sur un problème de "associative array" avec awk. Y a-t-il un 
spécialiste awk dans l'avion?

En bref, j'ai une base de donnée à ré-écrire sous un autre format, et la 
difficulté vient du fait que chaque record a un nombre de champ 
variable, et dans le désordre le plus total. Voir fichier tt1.txt en annexe.

Mon petit script awk se présente comme suit:

station0:~/tmp$ cat Export_filtre2.ak
BEGIN{
RS = "^L^M"
FS = "^M"
OFS = "\t"
}

{
for (i=1; i<= NF; i++)
         {
         split($i,array,":  ")
         nom = array[1]
         val = array[2]
         champ[nom]=val
         print i  nom champ[nom]
         print "AAA" champ["Type"]
         print "BBB" champ["LastName"]
         print "CCC" champ["FirstName"]
         print "DDD" champ["CompanyName"]
         print "EEE" champ["OfficeStreetAddress"]
         print "FFF" champ["OfficeCity"]
         print "GGG" champ["City"]
         }
}
station0:~/tmp$

Dans ce cript, j'attribue donc un nom (par exemple "LastName") pour 
chaque champ et une valeur pour ce champ (par exemple: "MEYER")

D'après ma doc (the AWK Programming Language, Aho, Kernigan, 
Weinberger), les subscripts des arrays sont des strings ce qui permet de 
dire que si nom="LastName" et que val="MEYER", je peux définir un array 
champ[nom],
et si j'attribue une valeur:
champ[nom] = val
la ligne  print champ["Lastname"]  me donne comme résultat MEYER

Curieusement, ça marche pour la première attribution et ensuite je 
n'arrive pas à ré-attribuer une nouvelle valeur à "champ[nom]" lorsque 
"nom" change à la prochaine itération de la boucle.

Voici le résultat ci-dessous. Deux choses m'intriguent:
A) pour le premier print (1TypePerson) tout est sur une seule ligne, 
alors que pour les print suivants, comme celui ci:
2
OrgTableE0
on a un saut de ligne ???

B) A partir du troisième champ, on devrait avoir
3
LastNameMEYER
AAAPerson
BBBMEYER
mais le MEYER n'apparait pas.

Quelqu'un saurait-il ce que je fais de faux?

Pierre Maitre


station0:~/tmp$ awk -f Export_filtre2.ak tt1.txt | head -40
1TypePerson
AAAPerson
BBB
CCC
DDD
EEE
FFF
GGG
2
OrgTableE0
AAAPerson
BBB
CCC
DDD
EEE
FFF
GGG
3
LastNameMEYER
AAAPerson
BBB
CCC
DDD
EEE
FFF
GGG
4
FirstNameAbel
AAAPerson
BBB
CCC
DDD
EEE
FFF
GGG
5
FullNameAbel MEYER
AAAPerson
BBB
CCC
station0:~/tmp$


-- 
Dr Pierre-O. Maitre
Privat Docent
FMH Anesthésiologie
FMH Pharmacologie Clinique
Cabinet médical / A la Joy
CH-1273 Genolier   Switzerland
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: tt1.txt
URL: <http://forum.linux-gull.ch/pipermail/gull/attachments/20031230/477373b1/attachment.txt>


More information about the gull mailing list