У меня есть команда, которая выводит несколько простых объектов 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
постоянна, не меняется.
Я бы использовал следующее:
jq --slurp --compact-output '{ a: map(.a) }' foo.txt
--slurp
заставляет jq
читать последовательность объектов JSON как массив этих объектов. Мы сопоставляем этот массив объектов с массивом значений их поля .a
и, наконец, возвращаем объект, который содержит этот массив в качестве своего поля .a
.
Вы можете попробовать здесь.
Опция -s — это пережиток былых дней, когда в jq не было input
и inputs
. Когда цель состоит в том, чтобы проиллюстрировать или поощрить передовой опыт, его использования, как правило, следует избегать, если это возможно, за исключением того, чтобы подчеркнуть его неэффективность.
@peak спасибо за ваш отзыв, я чувствовал, что режим slurp создан для более простого кода, и я не знал о его неэффективности. Думаю, мне придется привыкнуть к вводу[s]
Вы были очень близки. JQ не будет извлекать .a
из входных объектов, если вы явно не укажете это.
$ jq -n '.a = [inputs.a]' foo.txt
{
"a": [
"b",
"e",
"f"
]
}
inputs.a
не будет работать, если я не ошибаюсь, inputs
— это массив, и вы не можете получить доступ к его свойствам. [inputs | map(.a)]
будет работать нормально, хотя
@ Аарон, это не так. inputs
это стрим, ОП просто забыл .a
.
Плохо, я протестировал свой собственный образец и оставил --slurp
, что сделало inputs
пустым и вызвало ошибку, которую можно было интерпретировать как попытку проиндексировать массив с полем.
np, я бы так не предположил.
Является ли
.a
постоянным или может меняться/динамически?