[bash4] tableau associatif: élément en trop

Résolu/Fermé
Utilisateur anonyme - 13 juil. 2010 à 14:46
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 13 juil. 2010 à 20:36
Bonjour,

en repenant les données de nnj99 (https://forums.commentcamarche.net/forum/affich-18469647-sed-awk-pour-lier-2-fichier-plats j'ai cherché une solution en utilisant bash4, et ses tableaux associatifs, mais la boucle while que j'utilise semble ajouter un élément sans que j'arrive à voir d'où il provient
#!/usr/local/bin/bash

declare -A table

while read line; do
   table="${line::5}"
   champ="${line:11:6}"
   table[$table]+="$(sed -n '/'"$table"';;'"$champ"'/{s/[^;;]*;;[^;;]*;;\([^;;]*\);;\([^;;]*\);;\([^;;]*\);;.*/\1 \2 (\3)/
s/ C / Char /
s/ D / Date /
s/ N / Number /
p;q}' ${file2}), "
done < ${file1}
#unset table[0]

for i in "${!table[@]}"; do
   printf 'CREATE TABLE %s (%s\b\b);\n' "$i" "${table[$i]}"
done
output:
CREATE TABLE tab01 (champ1 Date (08), champ2 Number (05), champ3 Char (50));
CREATE TABLE tab02 (champ1 Date (08), champ2 Number (05));
CREATE TABLE 0 (tab);
Je peux le zapper en décommentant unset, mais c'est pas terrible :(

Vous avez une idée?

merci

4 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
Modifié par lami20j le 13/07/2010 à 18:41
Salut,

Il faut faire attention au nom des variables.

   table="${line::5}" 
   champ="${line:11:6}" 
   table[$table]+ 


table="${line::5} - ici tu ajoutes un élément au tableau table

Mets plutôt
   t="${line::5}" 
   champ="${line:11:6}" 
   table[$t]+


Dans ton code tu remarques qu'avant de commencer remplir le tableau avec sed il y a déjà un élément.

lami20j@debian-acer:~$ cat bb2.sh  
#!/usr/local/bin/bash 

declare -A table 
file1="fic1" 
file2="fic2" 


while read line; do 
   t="${line::5}" 
   champ="${line:11:6}" 
echo "---- ${#table[@]} élément(s)" 
   table[$t]+="$(sed -n '/'"$table"';;'"$champ"'/{s/[^;;]*;;[^;;]*;;\([^;;]*\);;\([^;;]*\);;\([^;;]*\);;.*/\1 \2 (\3)/ 
s/ C / Char / 
s/ D / Date / 
s/ N / Number / 
p;q}' ${file2}), " 
done < ${file1} 

for i in "${!table[@]}"; do 
   printf 'CREATE TABLE %s (%s\b\b);\n' "$i" "${table[$i]}" 
done 


lami20j@debian-acer:~$ sh bb.sh  
---- 1 élément(s) 
---- 2 élément(s) 
---- 2 élément(s) 
---- 2 élément(s) 
---- 3 élément(s) 
CREATE TABLE tab01 (champ1 Date (08), champ2 Number (05), champ3 Char (50)); 
CREATE TABLE tab02 (champ1 Date (08), champ2 Number (05)); 
CREATE TABLE 0 (tab); 
lami20j@debian-acer:~$ sh bb2.sh  
---- 0 élément(s) 
---- 1 élément(s) 
---- 1 élément(s) 
---- 1 élément(s) 
---- 2 élément(s) 
CREATE TABLE tab01 (champ1 Date (08), champ2 Number (05), champ3 Char (50)); 
CREATE TABLE tab02 (champ1 Date (08), champ2 Number (05)); 
lami20j@debian-acer:~$  

GNU/Linux:Linux is Not Ubuntu! Quel linux choisir ne veut pas dire votre Distribution préférée,
106485010510997108
1
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
13 juil. 2010 à 18:49
Bien joué ;-))

J'avais mis des echos de partout sauf là où tu as mis les tiens ;-\
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
13 juil. 2010 à 18:51
;-)
0
Utilisateur anonyme
13 juil. 2010 à 20:32
oh, le boulet ! c'est vrai que les tableaux sont des variables (presque) comme les autres.
un instant je l'ai oublié :((

merci lami20j.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
13 juil. 2010 à 20:36
Ben tu peux changer de pseudo : qqchquicommenceparB ;-DDD
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
13 juil. 2010 à 15:03
hello
une ligne vide dans un des fichiers ?
0
Utilisateur anonyme
13 juil. 2010 à 15:22
non.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
13 juil. 2010 à 16:57
Salut,

J'ai trituré ton code dans tous les sens, rajouté des marqueurs ( echo "${!table[@]}" ) après chaque itération, changer l'$IFS et rien n'y fait ;-(((

L'intrus est créé dès la création du 1er élément du tableau, pourquoi je n'en ai pas la moindre idée ;-\

A suivre... ;-))
0