Linux 如何遍历.json并获取.csv?

Linux 如何遍历.json并获取.csv?,linux,iteration,export-to-csv,jq,Linux,Iteration,Export To Csv,Jq,我有以下json内容: { "iccid": "1961021111937667", "timeStamp": "2021-03-25T09:42:30.681Z", "cycleStartDate": "2021-02-28T16:00:00.000Z", "cycleEndDate": "2021-03-31T14:59:59.000Z&quo

我有以下json内容:

{
"iccid": "1961021111937667",
"timeStamp": "2021-03-25T09:42:30.681Z",
"cycleStartDate": "2021-02-28T16:00:00.000Z",
"cycleEndDate": "2021-03-31T14:59:59.000Z",
"deviceCycleUsageInZones": {
"TEST-25GB, 1": [
{
"ratePlan": "TEST-25GB",
"ratePlanVersion": "1",
"zone": "default zone",
"dataUsage": 15155147646,
"dataUsageUnit": "bytes",
"voiceMTUsage": null,
"voiceMTUsageUnit": null,
"voiceMOUsage": null,
"voiceMOUsageUnit": null,
"smsmtusage": null,
"smsmousage": 3
}
],
"TEST-29GB, 1": [
{
"ratePlan": "TEST - 29602",
"ratePlanVersion": "1",
"zone": "default zone",
"dataUsage": null,
"dataUsageUnit": null,
"voiceMTUsage": 1080,
"voiceMTUsageUnit": "seconds",
"voiceMOUsage": 960,
"voiceMOUsageUnit": "seconds",
"smsmtusage": null,
"smsmousage": null
}
]
}
}
如何遍历.json文件的内容以获得以下.csv输出

1961021111937667, 2021-03-25T09:42:30.681Z,15155147646,bytes,null,null,null,null,null,3
1961021111937667, 2021-03-25T09:42:30.681Z,null,null,1080,seconds,960,seconds,null,null
换句话说,我希望包含以下标题:

iccid,timeStamp,dataUsage,dataUsageUnit,voiceMTUsage,voiceMTUsageUnit,voiceMOUsage,voiceMOUsageUnit,smsmtusage,smsmousage

假设输入的结构如图所示,则保证根据问题中的标题生成有效的CSV(包括标题):

["iccid","timeStamp"] as $h1
| ["dataUsage","dataUsageUnit","voiceMTUsage","voiceMTUsageUnit","voiceMOUsage","voiceMOUsageUnit","smsmtusage","smsmousage"] as $h2
| ($h1+$h2),
  ([.[$h1[]]] + (.deviceCycleUsageInZones[][] | [.[$h2[]]] ))
| @csv
如果您真的不希望字符串被引用,那么将
@csv
更改为
join(“,”
),并希望一切顺利

讨论 上述解决方案不依赖于JSON对象中键的顺序。这是通过使用成语实现的:

.[ $index[] ]

其中,
$index
是键名数组。这一点小聪明是可能的,因为给定一个jq表达式s,生成一个JSON值s1,s2,…,jq表达式
$x[s]
的计算结果是流:$x[s1],$x[s2],…,假设后面的jq表达式都是有效的。

Hi!请告诉我们你试过什么!