使用jq合并JSON数组并去重

3

我正苦于使用 jq 合并两个 JSON 数组,因为我想在合并后的对象中删除重复的键:

编辑:由于示例过于简单,因此添加了第二个键。

file1.json:

[
  {"a": 1, "value": 11},
  {"b": 2},
  {"c": 3}
]

file2.json :

[
  {"a": 4, "value": 44},
  {"b": 5},
  {"d": 6}
]

预期结果:

[
  {"a": 4, "value": 44},
  {"b": 5},
  {"c": 3},
  {"d": 6}
]

jq add file1.json file2.json会重复键名(我有两个键名为“a”的对象在数组中)。

我尝试了许多网络上的答案,但每个人都有自己的用例,没有一个直接奏效。最接近的是这个:JQ - Merge two arrays,但我无法将其与文件参数一起使用。

我最后的尝试是:

jq \
  --slurpfile base file1.json \
  --slurpfile params file2.json \
  '$base + $params | unique_by(.Key)'
2个回答

4

以下方法使用了在https://github.com/stedolan/jq/blob/master/src/builtin.jq中定义的INDEX/2

使用INDEX的一个优点是避免了使用group_by,它需要排序并可能不被期望。

如果你的jq版本没有INDEX/2,那么这是它的定义:

def INDEX(stream; idx_expr):
  reduce stream as $row ({};
    .[$row|idx_expr|
      if type != "string" then tojson
      else .
      end] |= $row);

该过滤器(INDEX/2)构建一个字典,其键等于应用于流元素的idx_expr的不同值,而与特定键相关联的值是映射到该值的流的最后一个项。

[INDEX( add[] | to_entries; (.[0] | .key) )[]
 | from_entries ]

调用:

jq -scf program.jq file1.json file2.json

输出:

[{"a":4,"value":44},{"b":5},{"c":3},{"d":6}]

1

jq solution:

jq --slurpfile file2 file2.json \
'. + $file2[] | map(to_entries) | flatten 
 | group_by(.key) | map(.[-1] | {(.key): .value})' file1.json

输出:

[
  {
    "a": 4
  },
  {
    "b": 5
  },
  {
    "c": 3
  },
  {
    "d": 6
  }
]

虽然它在我用作示例的简化情况下能正常工作,但是一旦其中一个对象有第二个键,比如 {"a": 1, "t": 10},它就会在结果中创建一个带有该键的新对象:[{"a": 1}, {"t": 10}] - JulienD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接