如何使用jq将AWS导出的JSON转换为含自定义字段与标签的指定格式CSV并支持追加写入
解决AWS JSON数据转指定格式CSV的问题
你现在的jq命令输出的是JSON对象,而非符合要求的CSV行,而且没正确把Tags展开到对应列里。咱们一步步修正这个问题:
核心问题分析
当前命令的几个关键问题:
- 用
{}生成了JSON对象,导致输出带大括号和键名 - 没有把Tags里的Key映射为CSV的列,而是把Tags打包成了一个字符串
- 没有生成你指定的表头
正确的jq命令实现
1. 首次生成完整CSV(含表头)
如果是第一次处理,先写入表头再处理数据:
# 先写入指定表头 echo "id,vol,state,size,colour,shape,weight" > test.csv # 处理JSON数据并追加到CSV cat test.json | jq -r ' .[] | [ .InstanceId, .Vol, .State, (.Tags | from_entries | .Size), (.Tags | from_entries | .Colour), (.Tags | from_entries | .Shape), (.Tags | from_entries | .Weight) ] | @csv ' >> test.csv
2. 循环追加资源时避免重复表头
如果要批量处理多个AWS资源文件,先检查CSV是否存在,不存在才写入表头,之后只追加数据行:
# 检查文件是否存在,不存在则写入表头 [ ! -f test.csv ] && echo "id,vol,state,size,colour,shape,weight" > test.csv # 处理当前JSON数据并追加到CSV cat test.json | jq -r ' .[] | [ .InstanceId, .Vol, .State, (.Tags | from_entries | .Size), (.Tags | from_entries | .Colour), (.Tags | from_entries | .Shape), (.Tags | from_entries | .Weight) ] | @csv ' >> test.csv
命令细节解释
-r参数:让jq输出原始字符串,避免额外的引号包裹.[]:遍历JSON数组里的每一个资源对象(.Tags | from_entries):把Tags数组转换成键值对对象(比如{"Size": "large", ...}),这样就能直接通过键名取值[ ... ]:把需要的字段按表头顺序组合成数组@csv:把数组格式化为符合CSV规范的行,自动处理特殊字符的引号包裹
最终输出效果
运行后test.csv的内容会是:
id,vol,state,size,colour,shape,weight "I-1234","vol-5678","in-use","large","red","square","light"
用Excel打开后会自动对应到每一列,完全符合你要求的格式。
内容的提问来源于stack exchange,提问作者zactec
相关产品推荐
相关产品推荐

