I am working with a JSON below:
{
"CITY": "JANCOK NJARAN",
"FATHER": {
"1": "WEDHUS",
"2": "ANDRE"
},
"MOTHER": {
"11": "SARAH",
"22": "EVELYN",
"33": "MARKONAH"
}
}
I parse it with jq to read json
file=$(cat config.json)
city=$(echo $file | ./jq '.CITY')
father=$(echo $base_config | ./jq '.FATHER[]')
I have $data
:
HE IS WEDHUS FROM JANCOK NJARAN, ALSO MARKONAH
For now i have a lot of problem, i know how to do it with php, but dont know how to do it with bash
what i want is parse the json using jq
and search string inside $data
with json provided
Expected output is like this.
Search in $data with JSON config :
Found WEDHUS with id 1 , and MARKONAH with id 2
Any help will be appreciated, thanks
CodePudding user response:
I'm not completely sure what you are trying to achieve, but this might help you on the way there:
Traverse the input document using ..
, and decompose the objects
found into an array of key-value pairs using to_entries
. Then, filter it by iterating .[]
over its items, and select
ing only those whose .value
, if in turn being strings
, is completely contained inside
the $data
string, which was provided as argument using the --arg
option on invocation). The remaining items can then be formatted to your liking, here using string interpolation \(…)
to produce strings, and the -r
option on invocation to output them in raw format (as opposed to being JSON encoded).
jq -r --arg data "$data" '
.. | objects | to_entries[]
| select(.value | strings | inside($data))
| "Found \(.value) with id \(.key)"
' config.json
Found JANCOK NJARAN with id CITY
Found WEDHUS with id 1
Found MARKONAH with id 33
If you want to disregard the top level (eg. CITY
), prepend ..
with .[] |
.
To just output a comma-separated list consisting only of all the matching IDs, wrap the whole traversal, filtering, and formatting into a pair of brackets […]
turning the whole result stream into an array, then use join
with a glue string to concatenate. Additional formatting such as wrapping the final list within parentheses can also be done here, eg. using again string interpolation.
jq -r --arg data "$data" '
[ .. | objects | to_entries[]
| select(.value | strings | inside($data)).key
] | "(\(join(",")))"
' config.json
(CITY,1,33)