考虑一个使用 JSON 对象的故意示例,例如此例,我想将许多数组对象中的每一个的相关 、 和 字段提取id
到firstname
shelllastname
变量中以便进一步(非 JSON)处理。
{
"customers": [
{
"id": 1234,
"firstname": "John",
"lastname": "Smith",
"other": "fields",
"are": "present",
"here": "etc."
},
{
"id": 2468,
"firstname": "Janet",
"lastname": "Green",
"other": "values",
"are": "probably",
"here": "maybe"
}
]
}
对于简单的数据我可以使用这个,
jq -r '.customers[] | (.id + " " + .firstname + " " + .lastname)' <data.json |
while IFS=' ' read id firstname lastname
do
# More processing, but omitted for the example
printf '%s -- %s -- %s\n' "$id" "$firstname" "$lastname"
done
输出
1234 -- John -- Smith
2468 -- Janet -- Green
但当然,如果使用双管firstname
值,例如,这将失败Anne Marie
。将分隔符更改为另一个字符,例如,#
感觉更像是敷衍,而不是解决方案,但可以接受。
对于更复杂的情况,我可能会挑选出值列表id
,然后通过回头提取相应的firstname
和lastname
元素来以速度换取准确性。就像这样:
jq -r '.customers[].id' <data.json |
while IFS= read id
do
block=$(jq -r --arg id "$id" '.customers[] | select(.id == $id)' <data.json);
firstname=$(jq -r '.firstname' <<<"$block")
lastname=$(jq -r '.lastname' <<<"$block")
# More processing, but omitted for the example
printf '%s -- %s -- %s\n' "$id" "$firstname" "$lastname"
done
输出
1234 -- John -- Smith
2468 -- Janet -- Green
但是,这两种方法都不是正确且高效的。虽然我不会频繁运行实际代码,但我想知道是否有更合适的方法可以安全有效地将多个数据元素从 JSON 对象结构中取出并放入 shell 变量中?