所以我的目标是合并json文件获取这种格式:
{
"title": "NamesBook",
"list": [
{
"name": "Ajay"
},
{
"name": "Al"
}
]
}
我的文件看起来像这种格式:
blahblah.json
{
"title": "NamesBook",
"list": [
{
"name": "Ajay"
}
]
}
blueblue.json
{
"title": "NamesBook",
"list": [
{
"name": "Al"
}
]
}
我可以将所有名字的列表数组存储在变量中,其中包含以下内容:
x = jq -s '.[].list' *.json
然后我计划将变量附加到我创建的文件out_json中的空数组中,如下所示:
{
"type": "NamesBook",
"list": []
}
然而,当我的脚本在线上运行时
jq '.list[] += "$x"' out.json'
它会出现jq错误:
无法迭代null。
即使添加随机元素,也会出现相同的错误。关于我应该如何进行的提示? jq中还有其他工具可以帮助实现合并数组吗?
答案 0 :(得分:7)
您可以将文件与添加(jq 1.3 +)合并:
jq -s '.[0].list=[.[].list|add]|.[0]' *.json
或展平(jq 1.5 +):
jq -s '.[0].list=([.[].list]|flatten)|.[0]' *.json
[.[].list]
- 创建一个包含所有" list"的数组。阵列
[
[
{
"name": "Ajay"
}
],
[
{
"name": "Al"
}
]
]
[.[].list]|flatten
- 展平它(或.[].list|add
- 将所有数组添加)
[
{
"name": "Ajay"
},
{
"name": "Al"
}
]
.[0].list=([.[].list]|flatten)|.[0]
- 替换第一个"列表"合并后,输出它。
{
"title": "NamesBook",
"list": [
{
"name": "Ajay"
},
{
"name": "Al"
}
]
}
答案 1 :(得分:6)
假设每个文件都具有相同的title
并且您只是简单地组合了list
内容,那么您可以这样做:
$ jq 'reduce inputs as $i (.; .list += $i.list)' blahblah.json blueblue.json
这只取第一项并将其添加到其列表中,列出所有其他输入。
答案 2 :(得分:3)
让我也提供标题要求的内容,因为我敢肯定很多关注此问题的人都在寻找更简单的东西:
echo -e '["a","b"]\n["c","d"]' | jq '.[]' | jq -s
[
“ a”,
“ b”,
“ c”,
“ d”
]
注意:上面的代码同样适用于对象数组。
答案 3 :(得分:1)
OP没有具体说明如果有.title不是" NamesBook"的对象会发生什么。如果目的是选择.title等于" NamesBook"的对象,可以写:
map(select(.title == "NamesBook"))
| {title: .[0].title, list: map( .list ) | add}
这假设使用-s选项调用jq。
顺便说一句,add
是这里的方式:简单快捷。