使用jq处理JSON时如何输出无groups键的对象并避免重复
你的命令存在两个问题根源:
- 开头的
map(select(.groups[].id)?)首先会过滤掉没有groups字段的对象,所以u1直接被丢掉了 .groups[]是展开数组操作,当groups有N个元素时,就会生成N条相同的上游对象副本,所以u2有2个group就输出了2次重复行
修改后的正确命令如下:
jq -r '.[] | [.user, .id, (.groups | if . then map(.name) | join(",") else "-" end)] | join("\t")' 你的json文件路径
逻辑说明:
- 直接用
.[]遍历所有用户对象,不做提前过滤,保留u1这类无groups的记录 - 对第三个字段做条件判断:如果当前对象存在groups,就提取所有name字段用逗号拼接;不存在就输出短横线占位
- 每一个对象直接拼接为制表符分隔的行输出,不需要额外合并操作
执行后输出完全符合你的预期:
u1 0001 - u2 0002 G1,G2 u3 0003 G1
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

