jq - 使用 jq 在某个键上组合两个对象数组
问题描述
我正在尝试使用jq
来解决这个问题。
假设我有以下对象
{
"listA": [
{
"id": "12345",
"code": "001"
}
]
"listB": [
{
"id": "12345",
"prop": "AABBCC"
}
]
}
实际上,我的两个列表更长,但id
每个列表中都没有重复。
如何将这两个列表组合成一个列表,其中每个项目都是一个对象,id
给定的非属性id
被收集到一个对象中?
例如,从上面的对象中,我想要以下内容:
{
"listC" : [
{
"id": "12345",
"code": "001",
"prop": "AABBCC"
}
]
}
解决方案
一种简单的方法是连接数组,按 id 对元素进行分组,然后使用 ; 将每个组映射到单个对象中add
。
jq '.listA+.listB | group_by(.id) | map(add)' test.json
如果文件中可能需要合并两个以上的数组,则可以改为使用flatten
来连接所有数组。
下面的测试用例
# cat test.json
{
"listA": [
{ "id": "12345", "code": "001" },
{ "id": "12346", "code": "002" }
],
"listB": [
{ "id": "12345", "prop": "AABBCC" }
]
}
# jq 'flatten | group_by(.id) | map(add)' test.json
# or
# jq '.listA+.listB | group_by(.id) | map(add)' test.json
[
{
"id": "12345",
"code": "001",
"prop": "AABBCC"
},
{
"id": "12346",
"code": "002"
}
]
推荐阅读
- favicon - 如何将网站图标添加到使用 parcel.js 制作的静态网页?
- python - 如何在 Python 中使用 DWT 的 HH、HL、LH 和 LL 波段重建图像?
- javascript - 提取打字稿属性
- css - 如何更改行中显示的卡片数量
- javascript - 通过 Node-Fetch 检索 OAuth2 令牌
- python-3.x - 用于将数字尾部与任何字符串分开的正则表达式?
- linux - 运行带有两个输入文件的程序的 shell 脚本
- postgresql - HorizontalPodAutoscaler | 设置/更新变量值
- protocol-buffers - GRPC:在浏览器和服务器之间传递带有 proto.Message 字段的 JSON
- tailwind-css - Tailwind CSS:创建自定义类时引用主题颜色