如何将VM软件包JSON转换为保留两级父级信息的CSV?
解决JSON转CSV时保留主机名与包名的问题
需要将包含两台VM(host1、host2)软件包信息的JSON转换为CSV,要求保留主机名和包名两级父级信息,但原jq命令输出缺失包名。
原jq命令
jq '.rows[]' | jq -r 'keys[] as $k | "\($k), \(.[$k][] | .arch), \(.[$k][] | .epoch), \(.[$k][] | .installdate | (tonumber|todate)), \(.[$k][] | .release),\(.[$k][] | .version)"'
原输出
host1, x86_64, 7, 2023-08-05T09:18:20Z, 6.0.5.el7_9.5,1.02.170 host2, x86_64, 7, 2023-08-05T10:50:31Z, 6.0.5.el7_9.5,1.02.170
期望输出
host1, packages.device-mapper-event-libs, x86_64, 7, 2023-08-05T09:18:20Z, 6.0.5.el7_9.5,1.02.170 host2, packages.device-mapper-event-libs, x86_64, 7, 2023-08-05T10:50:31Z, 6.0.5.el7_9.5,1.02.170
正确的jq命令
jq -r '.rows[] | keys[] as $host | .[$host] | keys[] as $pkg | "\($host), \($pkg), \(.[$pkg].arch), \(.[$pkg].epoch), \(.[$pkg].installdate | tonumber | todate), \(.[$pkg].release), \(.[$pkg].version)"'
命令说明
- 遍历
.rows[]中的每条主机记录 - 通过
keys[] as $host提取主机名(host1、host2) - 进入主机对应的对象后,用
keys[] as $pkg提取包名(packages.device-mapper-event-libs) - 按顺序拼接主机名、包名及包的各项属性值,完整保留两级父级信息
- 若单主机下存在多个包,命令会自动为每个包生成独立的CSV行,符合结构化输出要求
内容的提问来源于stack exchange,提问作者Jojo Thomas
相关产品推荐
相关产品推荐

