[bash4] tableau associatif: élément en trop [Résolu/Fermé]

Signaler
-
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
-
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

Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 537
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 858
Bien joué ;-))

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

merci lami20j.
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 858
Ben tu peux changer de pseudo : qqchquicommenceparB ;-DDD
Messages postés
18240
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
30 novembre 2020
5 282
hello
une ligne vide dans un des fichiers ?

non.
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 858
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... ;-))