Awk : test si une valeur appartient à un tableau

Bonjour,

J’essaye de tester si une valeur appartient à un tableau. Il doit y avoir une monstrueuse coquille, mais je ne la voit pas.

#!/usr/bin/awk -f
BEGIN {
  a[1]="Hello"
  a[2]=" World"
  a[3]=" !"
  for ( ndx in a )
    printf("%s",a[ndx])
  print "\n"

  # Pourquoi le test ci-dessous n'affiche rien ?
  if ( "Hello" in a )
    printf( "=> %s",a[1])
  }

Le tableau est pourtant bien rempli et son contenu affiché.

Une idée ?

salut,

`in’ “cherche” dans la liste des indices, et non dans les valeurs d’un tableau

Au cas où, 4 petits tests qui pourraient servir :

michel@debG53SW:~$ a[1]="Hello";a[2]="World";a[3]="!"
michel@debG53SW:~$ for elem in ${a[@]}; do echo "\"$elem\""; done
"Hello"
"World"
"!"
michel@debG53SW:~$ for elem in ${a[*]}; do echo "\"$elem\""; done
"Hello"
"World"
"!"
michel@debG53SW:~$ for elem in "${a[@]}"; do echo "\"$elem\""; done
"Hello"
"World"
"!"
michel@debG53SW:~$ for elem in "${a[*]}"; do echo "\"$elem\""; done
"Hello World !"
michel@debG53SW:~$ 

Merci à vous deux pour votre réponse si rapide.

@Watel, merci pour l’explication. Je n’avais pas compris le bon usage de “in” en “Awk”.

@MicP, j’avoue qu’il va me falloir un peu de temps pour comprendre la différence entre les différentes notations utilisées en “bash”.

Merci encore.

Le premier indice des tableaux bash est 0, aussi, j’ai failli te dire de te méfier des “trous” dans les tableaux car cela pouvait causer des problèmes dans la copie de tableaux.

Mais après quelques essais, je me rends compte que bash s’est encore amélioré. :smiley:

michel@debG53SW:~$ a[1]="Hello";a[3]="World";a[11]="!"  # J'ai un peu poussé la dispersion des éléments du tableau
michel@debG53SW:~$ echo ${!a[@]}                        # J'affiche la liste des indexs dont les éléments ne sont pas vides
1 3 11
michel@debG53SW:~$ copie=( "${a[@]}" )                  # Je créé un autre tableau par copie du tableau
michel@debG53SW:~$ echo ${!copie[@]}                    # et je constate qu'il n'y a pas de "trous" dans la copie
0 1 2
michel@debG53SW:~$ echo ${!a[@]}                        # les "trous" sont encore présents dans le tableau original
1 3 11
michel@debG53SW:~$ a=( "${a[@]}" )                      # Copie du tableau sur lui même pour "faire le ménage"
michel@debG53SW:~$ echo ${!a[@]}
0 1 2
michel@debG53SW:~$ 

Remarquable ! Je ne m’étais jamais intéressé au tableau en bash. Je ne soupçonnais pas que bash soit si puissant avec les tableau. Cela m’ouvre des perspectives intéressantes.

Merci pour le petit cours.

wiki.bash-hackers.org/doku.php

Après avoir fait quelques recherches, je te transmets quelques liens au sujet de bash et de ses tableaux :

abs.traduc.org/abs-fr/ch27.html

mywiki.wooledge.org/BashGuide/Arrays

Merci…Merci…Merci… à vous deux :038