Itérer tableau JSON en script Shell
J'ai un JSON données comme suit dans les données.fichier json
[
{"original_name":"pdf_convert","changed_name":"pdf_convert_1"},
{"original_name":"video_encode","changed_name":"video_encode_1"},
{"original_name":"video_transcode","changed_name":"video_transcode_1"}
]
Je veux parcourir le tableau et d'en extraire de la valeur de chaque élément dans une boucle. J'ai vu jq. Je trouve qu'il est difficile de l'utiliser pour effectuer une itération. Comment puis-je le faire?
- Ressemble
jq
a unforeach
commande, avez-vous essayé? - Honnêtement, je pense que vous auriez beaucoup plus satisfaits avec un simple script Python. Vous pouvez même intégrer dans votre script shell à l'aide de syntaxe heredoc.
- Pouvez-vous donner un exemple d'intégration de python dans un script shell?
Vous devez vous connecter pour publier un commentaire.
Il suffit d'utiliser un filtre qui permettrait le retour de chaque élément dans le tableau. Alors en boucle sur les résultats, assurez-vous d'utiliser le compact option de sortie (
-c
) de sorte que chaque résultat est à mettre sur une seule ligne et est traitée comme un élément de la boucle.for
boucle itère sur les espaces-mots séparés, pas de lignes.Essayer de le Construire autour de cet exemple. (Source: Site D'Origine)
Exemple:
Input [1,2,3,4,null,"a","b",null]
Output [[1,2,3,4],["a","b"]]
foreach
est nécessaire pour wha l'utilisateur veut.Une précédente réponse dans ce fil de discussion a suggéré d'utiliser jq du
foreach
, mais qui peut être beaucoup plus compliqué que nécessaire, en particulier compte tenu de l'énoncé de la tâche. Plus précisément,foreach
(etreduce
) sont destinés à certains cas où vous avez besoin d'accumuler des résultats.Dans de nombreux cas (y compris certains cas où, éventuellement, une réduction de l'étape est nécessaire), il est préférable d'utiliser
.[]
oumap(_)
. Le dernier est juste une autre façon d'écrire.[] | _] donc, si vous allez utiliser jq, il est vraiment utile pour comprendre cela .[] crée simplement un flux de valeurs.Par exemple,
[1,2,3] | .[]
produit un flux de données de ces trois valeurs.Une simple map-reduce exemple, supposons que vous voulez trouver la longueur maximale d'un tableau de chaînes de caractères. Une solution serait
[ .[] | length] | max
.jq
a une coquille option de mise en forme:@sh
.Vous pouvez utiliser la commande suivante pour formater vos données json comme shell paramètres:
La sortie ressemblera:
De traiter chaque ligne, nous avons besoin de faire un certain nombre de choses:
Pour lire l'intégralité de la ligne à chaque itération de la bash-boucle, réglez le
IFS
variable, comme décrit dans cette réponse.Afin d'enlever les guillemets, nous allons passer à travers le shell bash interprète à l'aide de
xargs
:Mettre tous ensemble, nous avons:
--raw-output
ou-r
drapeau à exclure les entourant de guillemets doubles, au lieu d'avoir à "bande de les enfermer à double quotes", en remplacement dejq @sh
avecjq -r @sh