[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