我想转换对象流:
{
"a": "green",
"b": "white"
}
{
"a": "red",
"c": "purple"
}
变成一个物体:
{
"a": "red",
"b": "white",
"c": "purple"
}
另外,如何将相同的序列包装到数组中?
[
{
"a": "green",
"b": "white"
},
{
"a": "red",
"c": "purple"
}
]
遗憾的是,该手册严重缺乏全面性,谷歌也找不到答案。
如果你的输入是对象流,那么除非你的 jq 有
inputs
,否则对象必须被“slurped”,例如使用 -s 命令行选项,以便将它们组合起来。
因此,组合输入流中的对象的一种方法是使用:
jq -s add
对于第二个问题,创建数组:
jq -s .
当然还有其他替代方案,但这些都很简单,并且不需要最新版本的 jq。对于 jq 1.5 及更高版本,您可以使用“输入”,例如
jq -n '[inputs]'
对于第一个问题(减少),与 slurping(无论是通过 -s 选项,还是使用
[inputs]
)相比,使用 reduce
与 inputs
和 -n 命令行选项会更有效。例如,要将对象流合并为单个对象:
jq -n 'reduce inputs as $in (null; . + $in)'
同样,没有
--null-input
:
jq 'reduce inputs as $in (.; . + $in)
使用 -s 命令行选项进行吸食的另一种方法是使用
inputs
过滤器。像这样:
jq -n '[inputs] | add'
这将生成一个包含所有输入对象的对象。
如果您通过 jq 过滤器而不是外部输入达到这一点,mwag 的评论建议将 jq 过滤器包装在
[]
s 中可能会很有用。
示例:
$ echo '[{"foo":42},{"foo":43}]' | jq '.[]'
{
"foo": 42
}
{
"foo": 43
}
$ echo '[{"foo":42},{"foo":43}]' | jq '[.[]]'
[
{
"foo": 42
},
{
"foo": 43
}
]
要将对象组合到数组中,您可以使用以下命令:
$ echo '
{
"a": "green",
"b": "white"
}
{
"a": "red",
"c": "purple"
}' | jq -n '[inputs]'
[
{
"a": "green",
"b": "white"
},
{
"a": "red",
"c": "purple"
}
]
我遇到了这些答案(2024 年第 2 季度),并且不得不进行修补才能使其正常工作
jq-1.6
。
给定一系列对象:
# objects.json
{ "foo": "bar" }
{ "biz": "baz" }
我能够将它们嵌入到其他一些自定义对象中,如下所示:
# Type I: single object
cat objects.json \
| jq -ns '{ type: "something", subtype: "specific", content: (inputs | add) }'
# Type II: list object
cat objects.json \
| jq -ns '{ type: "something", subtype: "specific", content: [inputs] }'
特别是,I 型是我必须修补的地方。