合并JSON数组

Waf*_*ffy 11 arrays bash json jq

所以我的目标是合并json文件获取这种格式:

{
  "title": "NamesBook",
  "list": [
    {
      "name": "Ajay"
    },
    {
      "name": "Al"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我的文件看起来像这样的格式:

blahblah.json

{
  "title": "NamesBook",
  "list": [
    {
      "name": "Ajay"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

blueblue.json

{
  "title": "NamesBook",
  "list": [
    {
      "name": "Al"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我可以使用以下内容将所有名称的列表数组存储在变量中:

x = jq -s '.[].list' *.json
Run Code Online (Sandbox Code Playgroud)

然后我计划将变量附加到我创建的文件out.json中的空数组中,如下所示:

{
  "type": "NamesBook",
  "list": []
}
Run Code Online (Sandbox Code Playgroud)

但是,当我的脚本在线上运行时

jq '.list[] += "$x"' out.json'
Run Code Online (Sandbox Code Playgroud)

它会出现jq错误:

无法迭代null.

即使我添加一个随机元素,也会出现相同的错误.关于我应该如何进行的提示?jq中还有其他工具可以帮助实现合并数组吗?

Jan*_*nou 13

让我也提供一下标题所要求的内容,因为我相信很多遇到这个问题的人都在寻找更简单的东西:

echo -e '["a","b"]\n["c","d"]' | jq '.[]' | jq -s
Run Code Online (Sandbox Code Playgroud)

[
"a",
"b",
"c",
"d"
]

注意:以上代码也适用对象数组


zep*_*lin 11

您可以使用add(jq 1.3+)合并文件:

jq -s '.[0].list=[.[].list|add]|.[0]' *.json
Run Code Online (Sandbox Code Playgroud)

扁平化(jq 1.5+):

jq -s '.[0].list=([.[].list]|flatten)|.[0]' *.json
Run Code Online (Sandbox Code Playgroud)

[.[].list] - 创建所有"列表"数组的数组

 [
  [
    {
      "name": "Ajay"
    }
  ],
  [
    {
      "name": "Al"
    }
  ]
]
Run Code Online (Sandbox Code Playgroud)

[.[].list]|flatten- 展平它(或.[].list|add- 所有数组加在一起)

[
  {
    "name": "Ajay"
  },
  {
    "name": "Al"
  }
]
Run Code Online (Sandbox Code Playgroud)

.[0].list=([.[].list]|flatten)|.[0] - 用合并的列表替换第一个"列表",输出它.

{
  "title": "NamesBook",
  "list": [
    {
      "name": "Ajay"
    },
    {
      "name": "Al"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)


Jef*_*ado 8

假设每个文件都具有相同titlelist内容而您只是组合内容,则可以执行以下操作:

$ jq 'reduce inputs as $i (.; .list += $i.list)' blahblah.json blueblue.json
Run Code Online (Sandbox Code Playgroud)

这只是获取第一个项目并添加到其列表中,所有其他输入的列表.