Объединить несколько объектов JSON в массив

У меня есть команда, которая выводит несколько простых объектов json, подобных этому (для целей разработки, ранее переданных в файл foo.txt):

$ cat foo.txt
{"a": "b"}
{"a": "e"}
{"a": "f"}

Теперь я хотел бы отформатировать его следующим образом:

{
  "a": ["b", "e", "f"]
}

Я почти уверен, что это можно сделать с помощью jq, но все, что я могу получить, это следующее:

$ cat foo.txt |jq -n '.a |= [inputs]'
{
  "a": [
    {
      "a": "b"
    },
    {
      "a": "e"
    },
    {
      "a": "f"
    }
  ]
}

Любые подсказки?

Является ли .a постоянным или может меняться/динамически?

Inian 15.12.2020 17:46
a постоянна, не меняется.
Isaac 15.12.2020 18:46
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
2
870
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я бы использовал следующее:

jq --slurp --compact-output '{ a: map(.a) }' foo.txt

--slurp заставляет jq читать последовательность объектов JSON как массив этих объектов. Мы сопоставляем этот массив объектов с массивом значений их поля .a и, наконец, возвращаем объект, который содержит этот массив в качестве своего поля .a.

Вы можете попробовать здесь.

Опция -s — это пережиток былых дней, когда в jq не было input и inputs. Когда цель состоит в том, чтобы проиллюстрировать или поощрить передовой опыт, его использования, как правило, следует избегать, если это возможно, за исключением того, чтобы подчеркнуть его неэффективность.

peak 15.12.2020 18:44

@peak спасибо за ваш отзыв, я чувствовал, что режим slurp создан для более простого кода, и я не знал о его неэффективности. Думаю, мне придется привыкнуть к вводу[s]

Aaron 15.12.2020 19:04
Ответ принят как подходящий

Вы были очень близки. JQ не будет извлекать .a из входных объектов, если вы явно не укажете это.

$ jq -n '.a = [inputs.a]' foo.txt
{
  "a": [
    "b",
    "e",
    "f"
  ]
}
inputs.a не будет работать, если я не ошибаюсь, inputs — это массив, и вы не можете получить доступ к его свойствам. [inputs | map(.a)] будет работать нормально, хотя
Aaron 15.12.2020 17:49

@ Аарон, это не так. inputs это стрим, ОП просто забыл .a.

oguz ismail 15.12.2020 17:49

Плохо, я протестировал свой собственный образец и оставил --slurp, что сделало inputs пустым и вызвало ошибку, которую можно было интерпретировать как попытку проиндексировать массив с полем.

Aaron 15.12.2020 17:51

np, я бы так не предположил.

Aaron 15.12.2020 17:55

Другие вопросы по теме