如何使用 jq 更改 json 数组字段中的值?

问题描述 投票:0回答:1

我想使用 jq 命令行实用程序为 json 数组中的同一字段分配不同的值,

举个例子:

myjson='[{"a":1,"b":"john"}, {"a":2, "b":"mark"}]'

通过以下内容,我可以为所有字段分配相同的值

echo $myjson | jq '[.[] | .a=5 ]'

我也可以增加它:

echo $myjson | jq '[.[] | .a+=2]'

但是如何将两个新的不同值(如 7 和 3)分配给数组中对象的两个 a 字段?

使用以下或类似的方法将整个数组分配给每个变量

echo $myjson | jq '[.[] | .a=[7,3]]'
json jq
1个回答
0
投票

按照您的方案,没有这样的解决方案,因为您的所有过滤器“立即”处理所有项目,这意味着与它们在数组中的位置无关。这就是为什么您只能将它们设置为相同的值或以相同的方式处理它们,而不使用它们的索引,这需要解决要使用的特定新值。

为了实现您的目标,您必须迭代数组索引或对齐元素。

前者可以通过使用

reduce
迭代新值并结合
to_entries
访问它们的位置(键),并使用键和值连续更新输入数组的项目来实现。

reduce ([3,7] | to_entries[]) as $i (.; .[$i.key].a = $i.value)
[
  {
    "a": 3,
    "b": "john"
  },
  {
    "a": 7,
    "b": "mark"
  }
]

演示

后者可以使用

transpose
内置函数来实现,它通过匹配两个(或任意数量)数组的索引来对齐它们的元素,并将它们输出为组合数组。

[., [3,7]] | [transpose[] | first + {a:last}]
[
  {
    "a": 3,
    "b": "john"
  },
  {
    "a": 7,
    "b": "mark"
  }
]

演示


注意:您的示例过滤器可以分别压缩为

.[].a = 5
(Demo) 和
.[].a += 2
(Demo)。

© www.soinside.com 2019 - 2024. All rights reserved.