输入
HTMLElement
期望的输出
{"key1": ["value1", "value2"], "key2": ["value3"]}
很难搞清楚jq命令来实现这个目标...我已经尝试过map,as,to_entries以各种组合过滤但没有运气。
答案 0 :(得分:3)
我删除了JSON对象周围的额外括号对,以使其成为有效的JSON。所以,从这开始:
{
"key1": [ "value1", "value2" ],
"key2": [ "value3" ]
}
我们应用to_entries
,它为我们提供了这个:
[
{
"key": "key1",
"value": [ "value1", "value2" ]
},
{
"key": "key2",
"value": [ "value3" ]
}
]
然后,我们map
每个条目,我们传播([]
).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"
答案 1 :(得分:1)
您可以跳过构建行的几个步骤。
$ jq -r 'to_entries[] | { key, value: .value[] } | [ .key, .value ] | @csv'
在jq 1.5中,您可以使用新的combinations
过滤器来生成键和值的组合。
$ jq -r 'to_entries[] | [ [.key], .value ] | combinations | @csv'
答案 2 :(得分:0)
这是一个简短的解决方案,仅使用jq&#39 []
运算符和\()
字符串插值。与jq -r
标志一起使用以避免最终输出中的额外引号。
. as $v
| keys[]
| "\(.), \($v[.][])"