Подтвердить что ты не робот

Как объединить последовательность объектов в jq в один объект?

Я хотел бы преобразовать поток объектов:

{
  "a": "green",
  "b": "white"
}
{
  "a": "red",
  "c": "purple"
}

в один объект:

{
  "a": "red",
  "b": "white",
  "c": "purple"
}

Также, как я могу обернуть одну и ту же последовательность в массив?

[
    {
      "a": "green",
      "b": "white"
    },
    {
      "a": "red",
      "c": "purple"
    }
]

К сожалению, руководство серьезно отсутствует в полноте, и поиск в Google не находит ответов.

4b9b3361

Ответ 1

Если ваши входные данные представляют собой поток объектов, то, если ваш jq не имеет inputs, объекты должны быть "стертыми", например, используя параметр командной строки -s, чтобы объединить их.

Таким образом, одним из способов объединения объектов во входном потоке является использование:

jq -s add

Для второй проблемы, создание массива:

jq -s .

Конечно, есть и другие альтернативы, но они просты и не требуют самой последней версии jq. С jq 1.5 и выше вы можете использовать "входы", например, jq -n '[inputs]'

Эффективные решения

Вместо того, чтобы портить (используя опцию -s или используя [inputs]), было бы более эффективно использовать reduce с inputs и опцией командной строки -n. Например, чтобы объединить поток объектов в один объект:

jq -n 'reduce inputs as $in (null; . + $in)'

Ответ 2

Альтернативой хлебопечению с использованием параметра командной строки -s является использование фильтра inputs. Вот так:

jq -n '[inputs] | add'

Это создаст объект со всеми входными объектами вместе.