输入
{"key1": ["value1", "value2"], "key2": ["value3"]}
期望的输出
key1, value1
key1, value2
key2, value3
很难找出 jq 命令来实现此目的...我尝试过各种组合的 map、as、to_entries 过滤器,但没有成功。
最佳答案
我删除了 JSON 对象周围额外的一对括号,以使其成为有效的 JSON。所以,从这里开始:
{
"key1": [ "value1", "value2" ],
"key2": [ "value3" ]
}
我们应用to_entries
,这给了我们这个:
[
{
"key": "key1",
"value": [ "value1", "value2" ]
},
{
"key": "key2",
"value": [ "value3" ]
}
]
然后,我们映射
每个条目,并展开 ([]
).value
数组,为每个条目创建一个单独的对象其元素 (map({key, value: .value[]})
)。这给了我们:
[
{
"key": "key1",
"value": "value1"
},
{
"key": "key1",
"value": "value2"
},
{
"key": "key2",
"value": "value3"
}
]
之后,对于每个对象,我们需要一个包含其值的数组,因为这是 @csv
过滤器所期望的。这只是映射到一个数组对象,如 map([.key, .value])
所示,它为我们提供了:
[
[ "key1", "value1" ],
[ "key1", "value2" ],
[ "key2", "value3" ]
]
最后,我们传播 ([]
) 数组数组(因为 @csv
需要单独的数组),并通过管道传输 @csv
到它。完整的脚本如下所示:
jq -r 'to_entries | map({key, value: .value[]}) | map([.key, .value])[] | @csv' test.json
及其输出:
"key1","value1"
"key1","value2"
"key2","value3"
关于bash - 使用 jq 将 json 映射转换为 csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32086615/