This is a very basic (probably silly) question but I can't get it to work...
I have a JSON file with this structure:
{ "data": { "what a burger": [1,2,3], "wap": [66], "the map": [11,20], "H. Incandenza": [1,1], "What a burger": [a,a,3] } }
I would like to extract the values of the fields within data whose "name" matches a certain pattern. For example, I would like to extract all the case-insensitive coincidences of "what a burger" to get
[1,2,3],[a,a,3]
My guess would be something like
jq '.data | match("what a burger";"i")'
but this results in
jq: error (at <stdin>:9): object ({"what a bu...) cannot be matched, as it is not a string
Cheers.
Your statement does not work, because you try to feed the data object into match, but match can only work on strings.
The following expression will do what you want. The to_entries
converts the object to an array of keys and values. Then we iterate over this array by using map
and select
all entries where the .key
(now a string) has a match
. Finally we just print out the value of every element.
.data | to_entries | map(select(.key | match("what a burger";"i"))) | map(.value)
However, two comments:
[a,a,3]
is not allowed in JSON, because a
is not a number.jq
will only output one of the elements then.Here's a slightly briefer alternative:
.data | with_entries(select(.key|match("what a burger";"i")))[]
After rectifying the input, and using jq's -c option, this would produce the two lines:
[1,2,3] ["a","a",3]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With