我有json文件,它是以simmilar方式构建的:
[
{
"_id":"1234",
"org":"org1",
"int":
{"url":"http://url.com.uk:1234"}},
{
"_id":"4321",
"org":"org2",
"int":
{"url":"http://url.com.us:4321"}},
...
]
现在我从一个条目“跳”到另一个条目并检查URL应用程序是否正常工作。检查后我想添加/更新字段“状态”。但我无法更新整个文件,我只是得到:
$ jq --arg mod "GOOD" '.[0].int + {stat: $mod}' tmp.json
{
"url": "http://url.com.uk:1234",
"stat": "GOOD"
}
如何使用jq命令获取新的整个文件,而不仅仅是其中的一部分?
答案 0 :(得分:2)
如果您将数据放入data.json
以及要进行的更改
每个记录到一个单独的arg.json
参数文件,如
{
"1234": { "int": { "stat": "GOOD" } },
"4321": { "int": { "stat": "BAD", "xxx": "yyy" } }
}
并以
运行jq$ jq -M --argfile arg arg.json 'map(. + $arg[._id])' data.json
然后它将输出更新的数据,例如
[
{
"_id": "1234",
"org": "org1",
"int": {
"stat": "GOOD"
}
},
{
"_id": "4321",
"org": "org2",
"int": {
"stat": "BAD",
"xxx": "yyy"
}
}
]
请注意,+
会替换密钥。如果要合并密钥,可以使用*
例如
$ jq -M --argfile arg arg.json 'map(. * $arg[._id])' data.json
生成
[
{
"_id": "1234",
"org": "org1",
"int": {
"url": "http://url.com.uk:1234",
"stat": "GOOD"
}
},
{
"_id": "4321",
"org": "org2",
"int": {
"url": "http://url.com.us:4321",
"stat": "BAD",
"xxx": "yyy"
}
}
]
如果您想更新数据,可以使用sponge 正如答案Manipulate JSON with jq中所述 e.g。
$ jq -M --argfile arg arg.json 'map(. * $arg[._id])' data.json | sponge data.json
答案 1 :(得分:0)
您可以通过操作映射到数组并重新设置int
,例如:
jq --arg mod "GOOD" '.[] | .int=.int + {stat: $mod}' tmp.json
{
"_id": "1234",
"org": "org1",
"int": {
"url": "http://url.com.uk:1234",
"stat": "GOOD"
}
}
{
"_id": "4321",
"org": "org2",
"int": {
"url": "http://url.com.us:4321",
"stat": "GOOD"
}
}