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)
假设每个文件都具有相同title的list内容而您只是组合内容,则可以执行以下操作:
$ jq 'reduce inputs as $i (.; .list += $i.list)' blahblah.json blueblue.json
Run Code Online (Sandbox Code Playgroud)
这只是获取第一个项目并添加到其列表中,所有其他输入的列表.