jq - 添加新字段以更新整个文件

时间:2017-08-23 02:41:28

标签: json linux bash shell jq

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

2 个答案:

答案 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"
  }
}