如何使用jq对JSON数据按字段分组并输出指定格式的原始文本
问题原因说明
你遇到的重复输出属于笛卡尔积问题,根源是原命令在同一个字符串插值内同时使用了两个独立的迭代器.v[].k1和.v[].k2:当g1分组有2条数据时,两个迭代器各有2个取值,jq会自动对所有取值做组合,最终生成2*2=4行错误的拼接结果。
正确jq命令
jq --raw-output 'group_by(.g)[] | (.[0].g), (.[] | "\(.k1) \(.k2)"), ""'
如果你需要去掉输出末尾多余的空行,可以使用调整后的版本:
jq --raw-output 'group_by(.g) | map((.[0].g), (.[] | "\(.k1) \(.k2)"), "") | .[0:-1][]'
命令逻辑说明
- 第一步用
group_by(.g)按g字段分组,输入会被处理为二维数组,每个子数组对应同一个g值的所有元素 - 遍历每个分组时:
- 先输出当前分组的g值
.[0].g - 再遍历分组内的每一条数据,单独拼接同一条数据的k1、k2值,避免多迭代器的组合问题
- 最后输出空行作为不同分组的分隔符
- 先输出当前分组的g值
内容的提问来源于stack exchange,提问作者r14i
相关产品推荐
相关产品推荐

