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

Résolu
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

  1. Modérateur
    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... ;-))
    1. Modérateur
      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. Modérateur
        Bien joué ;-))

        J'avais mis des echos de partout sauf là où tu as mis les tiens ;-\
      2. Modérateur
        ;-)
      3. oh, le boulet ! c'est vrai que les tableaux sont des variables (presque) comme les autres.
        un instant je l'ai oublié :((

        merci lami20j.
      4. Modérateur
        Ben tu peux changer de pseudo : qqchquicommenceparB ;-DDD