C'est une question très basique (probablement idiote) mais je n'arrive pas à la faire fonctionner ...
J'ai un fichier JSON avec cette structure:
{
"data": {
"what a burger": [1,2,3],
"wap": [66],
"the map": [11,20],
"H. Incandenza": [1,1],
"What a burger": [a,a,3]
}
}
Je voudrais extraire les valeurs des champs dans data dont le "nom" correspond à un certain modèle. Par exemple, je voudrais extraire toutes les coïncidences insensibles à la casse de "quel hamburger" pour obtenir
[1,2,3],[a,a,3]
Ma conjecture serait quelque chose comme
jq '.data | match("what a burger";"i")'
mais cela se traduit par
jq: error (at <stdin>:9): object ({"what a bu...) cannot be matched, as it is not a string
À votre santé.
Votre instruction ne fonctionne pas, car vous essayez d'alimenter l'objet de données en correspondance, mais la correspondance ne peut fonctionner que sur des chaînes.
L'expression suivante fera ce que vous voulez. Le to_entries
convertit l'objet en un tableau de clés et de valeurs. Ensuite, nous parcourons ce tableau en utilisant map
et select
toutes les entrées où le .key
(maintenant une chaîne) a un match
. Enfin, nous imprimons simplement la valeur de chaque élément.
.data | to_entries | map(select(.key | match("what a burger";"i"))) | map(.value)
Cependant, deux commentaires:
[a,a,3]
n'est pas autorisé dans JSON, car a
n'est pas un nombre.jq
ne produira alors qu'un seul des éléments.Voici une alternative légèrement plus brève:
.data | with_entries(select(.key|match("what a burger";"i")))[]
Après avoir rectifié l'entrée et utilisé l'option -c de jq, cela produirait les deux lignes:
[1,2,3]
["a","a",3]