2017-07-09 3 views
2

Je suis en train de découper un tableau dans JQ où l'indice final est passé comme un argument à partir du shell (bash):JQ: tableau tranchage basé sur l'argument

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

Cela fonctionne comme prévu lorsque l'indice est codés 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 <stdin>:0): Start and end indices of an array slice must be numbers 

Je soupçonne que ce serait peut-être à voir avec h ow jq gère la substitution de variables dans l'opérateur de tranche [:], mais aucune de mes tentatives pour résoudre le problème, par ex. en enfermant le nom de la variable dans les accolades .arr[0:${eidx}], a travaillé.

Répondre

2
  1. Vous pouvez convertir une chaîne à un numéro à l'aide tonumber, comme dans:.

jq --arg eidx 1 '.arr[0:($eidx|tonumber)]' 
  1. Si votre JQ est suffisamment récente, vous pouvez utiliser --argjson au lieu de --arg:

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

--argjson a fait le travail pour moi –

1

Lorsque vous passez un argument par --arg il est traité comme une chaîne, pas un int:

valeur Nom --arg:

Cette option passe une valeur au programme JQ comme prédéfini variable. Si vous lancez 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, donc --arg foo 123 liera $ foo à "123".

De the docs (ajouté) emphases

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

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

les guillemets doubles auront la coquille élargir votre variable avant de passer à jq (bien que d'autres développements d'arriver, alors assurez-vous de les dire à arrive

+0

Merci de remarquer l'interprétation comme une chaîne. L'expansion de Shell ne fonctionne pas toujours pour les commandes jq plus complexes, c'est pourquoi j'utilisais --arg en premier lieu –