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

Résolu
Utilisateur anonyme -  
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   -
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. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Bien joué ;-))

      J'avais mis des echos de partout sauf là où tu as mis les tiens ;-\
      0
    2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      ;-)
      0
    3. 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.
      0
    4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Ben tu peux changer de pseudo : qqchquicommenceparB ;-DDD
      0
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    hello
    une ligne vide dans un des fichiers ?
    0
  3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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