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

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

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

[
  {
    "value 1": 1,
    "value 2": 2,
    "value 3": 3,
    "value 4": 4
  }
]

和其他类型不相似,就像下面有很少的公共字段和其他字段

[
  {
    "value 3": 300,
    "value 4": 400,
    "value 5": 500,
    "value 6": 600
  }
]

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

jq -s '.' *.json > myfile.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
  }
],
[
  {
    "value 3": 300,
    "value 4": 400,
    "value 5": 500,
    "value 6": 600
  }
]

我需要将其合并到一个对象中,如下所示,以及是否有任何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
  }
]

答案1

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

jq -n '[ inputs[] | select( has("value 6") | not ) ]' *.json

通过这样做jq -n 'inputs[]',所有组成 JSON 文件中的所有对象都可供 select 函数使用,该函数会丢弃任何包含关键字段的对象"value 6"。过滤[..]器周围放置的是数组中的最终结果对象。

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

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

答案2

我使用 Node.js 创建了一个命令行工具来在本地合并嵌套的 json 文件。

https://github.com/divyeshmakwana96/injson

您可以使用!include('./path-to-json/item1.json')语句嵌入另一个 json 文件的内容。子 json 文件也可以有 include 语句。

例子:

{
  "pi": 3.141,
  "happy": true,
  "questions:": [
    "!include('./questions/item1.json')",
    "!include('./questions/item2.json')"
  ],
  "answer": "!include('./answers/item1.json')"
}

相关内容