如何用jq更简洁地将嵌套JSON展开为类CSV格式?
简化JSON展开为类CSV格式的jq实现
示例输入数据
[ { "user": { "foo": "a1", "bar": "b1" }, "data": [ { "baz": "c1.1", "beq": "d1.1" }, { "baz": "c1.2", "beq": "d1.2" } ] }, { "user": { "foo": "a2", "bar": "b2" }, "data": [ { "baz": "c2.1", "beq": "d2.1" }, { "baz": "c2.2", "beq": "d2.2" }, { "baz": "c2.3", "beq": "d2.3" } ] } ]
期望输出(类TSV格式)
a1 b1 d1.1 a1 b1 d1.2 a2 b2 d2.1 a2 b2 d2.2 a2 b2 d2.3
现有实现代码
.[] | .user as $user | foreach .data[] as $d ([]; . ; . + [$user.foo, $user.bar, $d.beq]) | @tsv
简化实现
可以直接通过嵌套遍历+数组构造完成,无需使用foreach:
.[] | .user as $u | .data[] | [$u.foo, $u.bar, .beq] | @tsv
逻辑说明
.[]遍历顶层的每个用户对象.user as $u暂存当前用户的foo和bar信息.data[]遍历当前用户下的每条数据记录[$u.foo, $u.bar, .beq]按需求组合成目标字段数组@tsv将数组转换为制表符分隔的文本格式
这个写法逻辑更直白,通过嵌套遍历实现用户信息与数据记录的笛卡尔积组合,代码量更精简。
内容的提问来源于stack exchange,提问作者murison
相关产品推荐
相关产品推荐

