jq在循环中向数组添加一个字段并返回整个json

时间:2018-05-15 02:41:59

标签: json shell jq

我想使用jq在json下面的aggregations.domains.buckets数组中添加一个字段,并返回带有新字段的完整json?我想添加{" cost":122.45},其中为每个密钥动态计算成本..

diltn

这是我的剧本:

1056.914

但它只返回json,只添加了最后一个字段。如何动态更新json?

提前致谢。

1 个答案:

答案 0 :(得分:1)

如果成本是输入JSON的函数,那么您使用的方法将遵循以下过滤器的方法,这只会增加{" cost":null}:

.aggregations.domains.buckets |= map( . + {cost} )

如果成本取决于key根据其他一些标准,则最好构造一个JSON字典,将键映射到成本,然后将该字典传递给jq,并合并结果使用以下所示的技术:

Combining JSON by common key-value pairs

使用vals.txt

的解决方案

program.jq:

.aggregations.domains.buckets |=
  reduce range(0; $costs|length) as $i (.;
      .[$i] += {cost: $costs[$i]} )

如果您希望费用为数字,请编写:

{cost: $costs[$i]|tonumber } )

调用:

jq -f program.jq --argfile costs <(jq -Rs '
  split("\n")|map(select(length>0))' vals.txt) input.json

输出:

{
  "aggregations": {
    "domains": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "other",
          "doc_count": 8679,
          "environments": {
            "value": 49
          },
          "cost": "1280.7631275949711"
        },
        {
          "key": "CREATIVESandPREVIEWS",
          "doc_count": 1235,
          "environments": {
            "value": 21
          },
          "cost": "2210.8813614145324"
        },
        {
          "key": "Integration",
          "doc_count": 65,
          "environments": {
            "value": 1
          },
          "cost": "3143.5814890583424"
        },
        {
          "key": "devops",
          "doc_count": 1,
          "environments": {
            "value": 1
          },
          "cost": "836.4116237582436"
        },
        {
          "cost": "1280.7631275949711"
        }
      ]
    }
  }
}