如何用jq将含数组/对象混合CPU字段的JSON转为指定CSV
解决JSON中CPU字段类型不一致转CSV的问题
问题场景
从XML提取的两段JSON数据中,cpu字段存在类型不一致的情况:一段是数组,一段是对象,需要通过bash结合jq工具将其转换为指定格式的CSV。
输入JSON:
{ "unit-type": "amp", "unit-id": "0", "cpu": [ { "cpu-id": "0", "temperature": "64(C)" }, { "cpu-id": "1", "temperature": "64(C)" } ] } { "unit-type": "bcp", "unit-id": "1", "cpu": { "cpu-id": "0", "temperature": "74(C)" } }
期望CSV输出:
unit-type,unit-id,cpu-id,temperature amp,0,0,64(C) amp,0,1,64(C) bcp,1,0,74(C)
解决方案
核心思路是先将cpu字段统一转换为数组类型,再遍历数组生成CSV行,具体命令如下:
( echo '["unit-type", "unit-id", "cpu-id", "temperature"]'; jq -r ' # 将cpu字段统一转为数组:对象转单元素数组,数组保持原样 .cpu |= if type == "object" then [.] else . end # 遍历每个cpu元素,组合外层字段与cpu字段 | .cpu[] as $cpu_item | [.unit-type, .unit-id, $cpu_item."cpu-id", $cpu_item.temperature] ' input.json ) | jq -r '@csv'
命令说明
- 统一CPU字段类型:通过
if type == "object" then [.] else . end判断cpu的类型,将对象包装成单元素数组,确保后续遍历逻辑统一。 - 组合字段生成数据行:遍历统一后的
cpu数组,将每个CPU元素的cpu-id、temperature与外层的unit-type、unit-id组合成JSON数组。 - 生成标准CSV:先输出表头的JSON数组,再将所有数据行的数组通过
jq -r '@csv'转换为CSV格式,自动处理字段的引号和分隔符。
内容的提问来源于stack exchange,提问作者Benjamin
相关产品推荐
相关产品推荐

