如何用Shell脚本提取JSON中两个数组并合并为CSV格式?
合并JSON中两个数组为CSV格式(Shell脚本实现)
需求说明
需要从JSON数据里的两个独立数组(Defaults.Timestamps和MetricDataForAccount[0].Values)按对应位置配对,输出成Excel可直接打开的CSV格式。
示例JSON数据
{ "Defaults": { "Timestamps": [ 1677801540, 1677801480, 1677801420 ] }, "MetricDataForAccount": [ { "Values": [ 2920126.416862745, 2920285.9993725484, 2920305.409303922 ] } ] }
原命令及问题
原使用的jq命令:
jq -r '. | "\(.Defaults.Timestamps) \(.MetricDataForAccount[].Values)"'
输出仅原样打印两个数组,无法实现元素配对:
Output
[1677801540,1677801480,1677801420] [2920126.416862745,2920285.9993725484,2920305.409303922]
预期输出
1677801540, 2920126.416862745 1677801480, 2920285.9993725484 1677801420, 2920305.409303922
解决方案
方法1:标准CSV格式输出
使用以下jq命令,生成符合CSV规范的输出,确保Excel可直接识别:
jq -r '.Defaults.Timestamps as $ts | .MetricDataForAccount[0].Values as $vals | [$ts, $vals] | transpose[] | @csv'
命令说明
.Defaults.Timestamps as $ts:将时间戳数组存入变量$ts.MetricDataForAccount[0].Values as $vals:将数值数组存入变量$vals[$ts, $vals]:把两个数组包装成二维数组transpose[]:转置二维数组,让两个数组的对应元素组成子数组@csv:将子数组格式化为标准CSV行
方法2:完全匹配预期格式输出
如果需要严格保留数值前的空格,可使用索引遍历的方式:
jq -r '.Defaults.Timestamps as $ts | .MetricDataForAccount[0].Values as $vals | range(0; $ts|length) | "\($ts[.]), \($vals[.])"'
命令说明
range(0; $ts|length):遍历数组的索引范围"\($ts[.]), \($vals[.])":按索引取出对应位置的元素,拼接成指定格式的字符串
内容的提问来源于stack exchange,提问作者4rb3l
相关产品推荐
相关产品推荐

