[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 -
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
Vous avez une idée?
merci
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
-
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ôtt="${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 -
hello
une ligne vide dans un des fichiers ? -
-
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... ;-))