2 votes

Jq: trancher un tableau en fonction de l'argument

Je suis en train de découper un tableau en jq où l'index de fin est passé en argument depuis le shell (bash) :

end_index=7
cat obj.json | jq --arg eidx $end_index, '.arr[0:$eidx]'

Cela fonctionne comme prévu lorsque l'index est codé en dur

cat obj.json | jq '.arr[0:7]'

mais dans l'exemple en haut, je reçois un message d'erreur

jq: error (at :0): Les indices de début et de fin d'une tranche de tableau doivent être des nombres

Je soupçonne que cela pourrait être lié à la façon dont jq gère la substitution de variable dans l'opérateur de tranche [:], mais aucune de mes tentatives pour résoudre le problème, par exemple en mettant le nom de la variable entre crochets .arr[0:${eidx}], n'a fonctionné.

2voto

peak Points 71
  1. Vous pouvez convertir une chaîne en nombre en utilisant tonumber, comme ceci :

    jq --arg eidx 1 '.arr[0:($eidx|tonumber)]'

  2. Si votre jq est suffisamment récent, vous pouvez utiliser --argjson à la place de --arg :

    jq --argjson eidx 1 '.arr[0:$eidx]'

1voto

Eric Renouf Points 10898

Lorsque vous passez un argument via --arg, il est traité comme une chaîne de caractères, pas un entier:

--arg name value:

Cette option passe une valeur au programme jq sous forme de variable prédéfinie. Si vous exécutez jq avec --arg foo bar, alors $foo est disponible dans le programme et a la valeur "bar". Notez que la valeur sera traitée comme une chaîne de caractères, donc --arg foo 123 liera $foo à "123".

De la documentation (emphase ajoutée)

il semblerait donc que vous ne pouvez pas utiliser --arg pour transmettre une valeur à utiliser dans une tranche. Dans cet exemple, vous pourriez simplement utiliser l'expansion du shell :

jq ".arr[0:$end_index]" obj.json

les guillemets doubles feront en sorte que le shell étende votre variable avant de la transmettre à jq (bien que d'autres extensions se produiront également, assurez-vous donc de vouloir qu'elles se produisent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X