如何使用 jq 将 2 个对象转换为 CSV?
How to use jq to convert 2 objects into CSV?
我正在尝试转换如下所示的对象:
{
"metricId": "metric1",
"data": [
{
"dimensions": [
"DEVICE-a1b2c3",
"queue1"
],
"dimensionMap": {
"Queue": "queue1",
"enitity": "DEVICE-a1b2c3"
},
"timestamps": [
1626286800000
],
"values": [
1
]
},
{
"dimensions": [
"DEVICE-a1b2c3",
"queue2"
],
"dimensionMap": {
"Queue": "queue2",
"entity": "DEVICE-a1b2c3"
},
"timestamps": [
1626286800000
],
"values": [
2
]
}
]
}
{
"metricId": "metric2",
"data": [
{
"dimensions": [
"DEVICE-a1b2c3",
"queue1"
],
"dimensionMap": {
"Queue": "queue1",
"entity": "DEVICE-a1b2c3"
},
"timestamps": [
1626286800000
],
"values": [
11
]
},
{
"dimensions": [
"DEVICE-a1b2c3",
"queue2"
],
"dimensionMap": {
"Queue": "queue2",
"entity": "DEVICE-a1b2c3"
},
"timestamps": [
1626286800000
],
"values": [
22
]
}
]
}
到如下所示的 CSV:
"metric1","queue1",1626286800000,1
"metric1","queue1",1626286800000,2
"metric2","queue1",1626286800000,11
"metric2","queue1",1626286800000,22
我有点成功,但我的结果重复了。
命令:jq -r '. | {id:.metricId, queue: .data[].dimensionMap.Queue, time: .data[].timestamps[0], value: .data[].values[0]} | [.id, .queue, .time, .value] | @csv'
输出:
"metric1","queue1",1626286800000,1
"metric1","queue1",1626286800000,2
"metric1","queue1",1626286800000,1
"metric1","queue1",1626286800000,2
"metric1","queue2",1626286800000,1
"metric1","queue2",1626286800000,2
"metric1","queue2",1626286800000,1
"metric1","queue2",1626286800000,2
"metric2","queue1",1626286800000,11
"metric2","queue1",1626286800000,22
"metric2","queue1",1626286800000,11
"metric2","queue1",1626286800000,22
"metric2","queue2",1626286800000,11
"metric2","queue2",1626286800000,22
"metric2","queue2",1626286800000,11
"metric2","queue2",1626286800000,2
我查看了文档和几个博客 posts/videos 但到目前为止我还没有找到解决方案。感谢您的帮助。
解决该问题的一种方法是使用 jq "$-variables":
.metricId as $metricId
| .data[]
| .dimensionMap.Queue as $q
| [.timestamps, .values] | transpose[]
| [$metricId, $q, .[]]
| @csv
我正在尝试转换如下所示的对象:
{
"metricId": "metric1",
"data": [
{
"dimensions": [
"DEVICE-a1b2c3",
"queue1"
],
"dimensionMap": {
"Queue": "queue1",
"enitity": "DEVICE-a1b2c3"
},
"timestamps": [
1626286800000
],
"values": [
1
]
},
{
"dimensions": [
"DEVICE-a1b2c3",
"queue2"
],
"dimensionMap": {
"Queue": "queue2",
"entity": "DEVICE-a1b2c3"
},
"timestamps": [
1626286800000
],
"values": [
2
]
}
]
}
{
"metricId": "metric2",
"data": [
{
"dimensions": [
"DEVICE-a1b2c3",
"queue1"
],
"dimensionMap": {
"Queue": "queue1",
"entity": "DEVICE-a1b2c3"
},
"timestamps": [
1626286800000
],
"values": [
11
]
},
{
"dimensions": [
"DEVICE-a1b2c3",
"queue2"
],
"dimensionMap": {
"Queue": "queue2",
"entity": "DEVICE-a1b2c3"
},
"timestamps": [
1626286800000
],
"values": [
22
]
}
]
}
到如下所示的 CSV:
"metric1","queue1",1626286800000,1
"metric1","queue1",1626286800000,2
"metric2","queue1",1626286800000,11
"metric2","queue1",1626286800000,22
我有点成功,但我的结果重复了。
命令:jq -r '. | {id:.metricId, queue: .data[].dimensionMap.Queue, time: .data[].timestamps[0], value: .data[].values[0]} | [.id, .queue, .time, .value] | @csv'
输出:
"metric1","queue1",1626286800000,1
"metric1","queue1",1626286800000,2
"metric1","queue1",1626286800000,1
"metric1","queue1",1626286800000,2
"metric1","queue2",1626286800000,1
"metric1","queue2",1626286800000,2
"metric1","queue2",1626286800000,1
"metric1","queue2",1626286800000,2
"metric2","queue1",1626286800000,11
"metric2","queue1",1626286800000,22
"metric2","queue1",1626286800000,11
"metric2","queue1",1626286800000,22
"metric2","queue2",1626286800000,11
"metric2","queue2",1626286800000,22
"metric2","queue2",1626286800000,11
"metric2","queue2",1626286800000,2
我查看了文档和几个博客 posts/videos 但到目前为止我还没有找到解决方案。感谢您的帮助。
解决该问题的一种方法是使用 jq "$-variables":
.metricId as $metricId
| .data[]
| .dimensionMap.Queue as $q
| [.timestamps, .values] | transpose[]
| [$metricId, $q, .[]]
| @csv