JQ объединить несколько объектов в массиве в один - PullRequest
0 голосов
/ 19 марта 2020

У меня есть серия json файлов, из которых я хочу извлечь некоторую информацию и вставить в CSV с помощью jq. Данные, которые мне нужны, выглядят примерно так:

[{"content":"Apples","_id":"7OLZ","type":"fruit}, 
{"content":"Oranges","_id":"5BHY","type":"fruit"},
{"content":"Pears","_id":"DJQD","type":"fruit"}]

Я хочу, чтобы можно было объединить только значения фруктов в строку без других ключей и занимать одну ячейку в электронной таблице. Файлы также могут иметь различное количество фруктов в массиве.

"Apples Oranges Pears"

Это выполнимо? Этот пост на SO близок, я думаю, но как человек, который не работает с json данными или jq в целом, я не мог собрать воедино то, что на самом деле делало решение.

Большое спасибо за понимание

Ответы [ 3 ]

1 голос
/ 19 марта 2020

Мое решение помещает все значения для ключа "содержимого" в массив, а затем соединяет элементы массива с пробелом.

jq '[.[] | .content ]|join(" ")'

Вывод: "Apples Oranges Pears"

Учитывая, что определение карты (x) равно [.[] | x], это эквивалентно.

jq 'map(.content)|join(" ")'
1 голос
/ 19 марта 2020

Я хочу объединить только значения фруктов

Предположительно, поэтому вы захотите проверить .type, например,

jq -r 'map(select(.type=="fruit").content) | join(" ")'
1 голос
/ 19 марта 2020

Если ваш файл хранится как j. json

[{
                "content": "Apples",
                "_id": "7OLZ",
                "type": "fruit"
        },
        {
                "content": "Oranges",
                "_id": "5BHY",
                "type": "fruit"
        },
        {
                "content": "Pears",
                "_id": "DJQD",
                "type": "fruit"
        }
]

, эта команда поможет.

jq '.[] | [.content] | join(",") '    j.json
...