使用带参数的 JQ 将多个 json 文件合并为一个对象

Dev*_*eam 4 json jq

我有数千个 JSON 文件要合并到一个对象中。这些都不是类似的格式。让我详细解释一下。这是 JSON 的第一个示例

[
  {
    "value 1": 1,
    "value 2": 2,
    "value 3": 3,
    "value 4": 4
  }
]
Run Code Online (Sandbox Code Playgroud)

和其他类型不相似,就像下面有几个公共字段和其他字段

[
  {
    "value 3": 300,
    "value 4": 400,
    "value 5": 500,
    "value 6": 600
  }
]
Run Code Online (Sandbox Code Playgroud)

例如我有 2 个具有第一种示例格式的文件和一个具有第二种示例格式的文件。我正在尝试jq用于合并它。

jq -s '.' *.json > myfile.json
Run Code Online (Sandbox Code Playgroud)

它使用三个不同的对象返回以下内容

[
  {
    "value 1": 1,
    "value 2": 2,
    "value 3": 3,
    "value 4": 4
  }
],
[
  {
    "value 1": 10,
    "value 2": 20,
    "value 3": 30,
    "value 4": 40
  }
],
[
  {
    "value 3": 300,
    "value 4": 400,
    "value 5": 500,
    "value 6": 600
  }
]
Run Code Online (Sandbox Code Playgroud)

我需要将它合并到一个对象中,如下所示,如果有任何jq选项可以排除那些具有特定字段的文件。类似于排除那些具有字段的文件"value 6"。所以最后 JSON 输出将是

[
  {
    "value 1": 1,
    "value 2": 2,
    "value 3": 3,
    "value 4": 4
  },
  {
    "value 1": 10,
    "value 2": 20,
    "value 3": 30,
    "value 4": 40
  }
]
Run Code Online (Sandbox Code Playgroud)

Ini*_*ian 5

您可以使用inputs将过滤器应用于所有 JSON 文件的内容,并应用选择过滤器。该-n标志是为了确保输出 JSON 是根据给定的输入从头开始构建的。

jq -n '[ inputs[] | select( has("value 6") | not ) ]' *.json
Run Code Online (Sandbox Code Playgroud)

通过这样做jq -n 'inputs[]',所有组成 JSON 文件中的所有对象都可用于 select 函数,该函数丢弃任何包含键字段的对象 as "value 6"。在[..]围绕过滤器被放置在阵列内的最终得到的对象。

另一种方法是使用reduce()函数以迭代方式添加所需的对象

jq -n 'reduce inputs[] as $data (.; . + [ if $data | has("value 6") | not then $data else empty end ] )'
Run Code Online (Sandbox Code Playgroud)

  • @Devil'sDream:很高兴能帮到你。但是你的问题是全新的。恐怕我无法根据您的新要求修改我当前的答案。你能发布一个新问题吗? (3认同)