Объединение полей из разных массивов в jq

#json #api #jq

Вопрос:

У меня есть следующий тип массива:

 {
  "name": [
    "Paul",
    "Alex",
    "John"
  ],
  "age": [
    "22",
    "31",
    "56"
  ],
  "town": [
    "New York",
    "Los Angeles",
    "Detroit"
  ]
}

 

Исходя из этого, я хочу создать новые массивы с соответствующей информацией, объединенные в один большой массив, называемый «элементы».

 {"items": [
    {
        "name": "Paul",
        "age": "22",
        "town": "New York"
    },
    {
        "name": "Alex",
        "age": "31",
        "town": "Los Angeles"
    },
    {
        "name": "John",
        "age": "56",
        "town": "Detroit"
    },
]}
 

Я обнаружил, что могу сделать что-то подобное, чтобы получить первую строку в массиве, но я не могу найти, как выполнить итерацию по всем строкам.

 jq '{items: [{ name: .name | first,  age: .age | first, town: .town | first}]}'
 

Ответ №1:

Вот простое решение, которое было бы легко адаптировать для обработки переименования ключей:

 [.[]]
| transpose
| {items: map( {name: .[0], age: .[1], town: .[2] } )}
 

Комментарии:

1. Спасибо! Я думаю, что я пойду с этим, так как мне действительно нужно переименовать ключи (о чем я забыл упомянуть).

Ответ №2:

Вот решение, которое позволяет легко обрабатывать имена ключей без явного упоминания любого из них:

 def objectify($keys):
  with_entries( .key |= $keys[.] );

keys_unsorted as $keys
| [.[]]
| transpose
| {items: map( objectify($keys) )}