JQ - 添加新字段并更新整个文件



我有以类似方式构造的json文件:

[
{
"_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命令获取新的更新的整个文件,而不仅仅是其中的一部分?

如果您将数据放入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"
}
}
]

如果要就地更新数据,可以使用海绵 如答案使用 jq 操作 JSON 中所述 例如

$ jq -M --argfile arg arg.json 'map(. * $arg[._id])' data.json | sponge data.json

您可以映射到数组并通过操作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"
}
}

最新更新