如何使用 jq 将哈希数组 JSON 输入的数组的哈希转换为 CSV?
How to convert a hash of an array of array of hashes JSON input into CSV using jq?
我要转换存储在文件中的以下JSON内容input.json
{
"results": [
[
{
"field": "field1",
"value": "value1-1"
},
{
"field": "field2",
"value": "value1-2"
},
{
"field": "field3",
"value": "value1-3"
}
],
[
{
"field": "field1",
"value": "value2-1"
},
{
"field": "field2",
"value": "value2-2"
},
{
"field": "field3",
"value": "value2-3"
}
],
[
{
"field": "field1",
"value": "value3-1"
},
{
"field": "field2",
"value": "value3-2"
},
{
"field": "field3",
"value": "value3-3"
}
]
]
}
转换为 CSV 输出
"field1","field2","field3"
"value1-1","value1-2","value1-3"
"value2-1","value2-2","value2-3"
"value3-1","value3-2","value3-3"
我想出的最接近的 jq 表达式是这样的:
$ cat input.json | jq -r '.results | .[] | map(.field), map(.value) | @csv'
"field1","field2","field3"
"value1-1","value1-2","value1-3"
"field1","field2","field3"
"value2-1","value2-2","value2-3"
"field1","field2","field3"
"value3-1","value3-2","value3-3"
这仍然不正确。我应该如何编写 jq 表达式以获得所需的 CSV 输出?
您正在将 .[]
喂入 map(.field)
以及 map(.value)
。
仅对 first
项使用 map(.field)
,对所有项使用 map(.value)
.[]
:
jq -r '.results | (first | map(.field)), (.[] | map(.value)) | @csv' input.json
我要转换存储在文件中的以下JSON内容input.json
{
"results": [
[
{
"field": "field1",
"value": "value1-1"
},
{
"field": "field2",
"value": "value1-2"
},
{
"field": "field3",
"value": "value1-3"
}
],
[
{
"field": "field1",
"value": "value2-1"
},
{
"field": "field2",
"value": "value2-2"
},
{
"field": "field3",
"value": "value2-3"
}
],
[
{
"field": "field1",
"value": "value3-1"
},
{
"field": "field2",
"value": "value3-2"
},
{
"field": "field3",
"value": "value3-3"
}
]
]
}
转换为 CSV 输出
"field1","field2","field3"
"value1-1","value1-2","value1-3"
"value2-1","value2-2","value2-3"
"value3-1","value3-2","value3-3"
我想出的最接近的 jq 表达式是这样的:
$ cat input.json | jq -r '.results | .[] | map(.field), map(.value) | @csv'
"field1","field2","field3"
"value1-1","value1-2","value1-3"
"field1","field2","field3"
"value2-1","value2-2","value2-3"
"field1","field2","field3"
"value3-1","value3-2","value3-3"
这仍然不正确。我应该如何编写 jq 表达式以获得所需的 CSV 输出?
您正在将 .[]
喂入 map(.field)
以及 map(.value)
。
仅对 first
项使用 map(.field)
,对所有项使用 map(.value)
.[]
:
jq -r '.results | (first | map(.field)), (.[] | map(.value)) | @csv' input.json