如何使用jq将嵌套用户属性JSON转换为目标CSV格式输出
jq生成目标CSV格式的修改方案
开箱即用的命令
针对你给出的示例结构,运行以下命令即可得到要求的输出:jq -r '.Users[] | [.Attributes[].Value] | join(",")' test.json
命令运行后输出效果完全匹配目标格式:
1,1234,abc 2,5678,def
原命令的问题
你之前使用的.Users[] .Attributes[] .Value 没有按用户维度做数据打包,相当于顺着JSON层级直接把所有匹配到的Value全平铺掏出来,既没有把同一个用户的三个值归成一组,也没做字符串拼接,自然就会输出逐行分散的属性值,凑不出每行3个值的CSV结构。
命令各部分作用
-r是jq的原生输出开关,加上之后就不会给输出的字符串自动套JSON格式的双引号,直接输出纯文本内容.Users[]还是保留你原来的遍历逻辑,逐一把Users数组里的每个用户对象拿出来处理[.Attributes[].Value]会把当前正在处理的这个用户名下的所有属性值收集成一个临时数组,保证每个用户的数据独立成组,不会和其他用户的值混到一起join(",")会把刚才收集到的数组元素用英文逗号拼成一整段字符串,直接输出成CSV的一行内容
更稳的适配方案
如果实际用的时候,Attributes数组里的属性顺序是乱的,直接按位置取值很容易出现列错位的问题,可以直接按属性名匹配固定取数顺序,对应的命令改成:
jq -r '.Users[] | [.Attributes[] | select(.Name=="sub").Value, select(.Name=="phone_number").Value, select(.Name=="referral_code").Value] | join(",")' test.json
这个命令完全不依赖Attributes的数组顺序,不管属性怎么排,都会严格按sub、手机号、推荐码的顺序提取值,实际用起来不容易出问题。
内容的提问来源于stack exchange,提问作者understack
相关产品推荐
相关产品推荐

