Я удалил дополнительную пару кронштейнов вокруг вашего объекта 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"
Спасибо Сантьяго за пошаговое объяснение. Обновлен вопрос об удалении дополнительных скобок (был результатом того, что я пытался упростить ввод сообщения) –