问题
I would like to convert the stream of objects:
{
"a": "green",
"b": "white"
}
{
"a": "red",
"c": "purple"
}
into one object:
{
"a": "red",
"b": "white",
"c": "purple"
}
Also, how can I wrap the same sequence into an array?
[
{
"a": "green",
"b": "white"
},
{
"a": "red",
"c": "purple"
}
]
Sadly, the manual is seriously lacking in comprehensiveness, and googling doesn't find the answers either.
回答1:
If your input is a stream of objects, then unless your jq has inputs
, the objects must be "slurped", e.g. using the -s command-line option, in order to combine them.
Thus one way to combine objects in the input stream is to use:
jq -s add
For the second problem, creating an array:
jq -s .
There are of course other alternatives, but these are simple and do not require the most recent version of jq. With jq 1.5 and later, you can use 'inputs', e.g. jq -n '[inputs]'
Efficient solutions
Rather than slurping (whether via the -s option, or using [inputs]
), it would be more efficient to use reduce
with inputs
and the -n command-line option. For example, to combine the stream of objects into a single object:
jq -n 'reduce inputs as $in (null; . + $in)'
回答2:
An alternative to slurping using the -s command-line option is to use the inputs
filter. Like so:
jq -n '[inputs] | add'
This will produce an object with all the input objects combined.
来源:https://stackoverflow.com/questions/34477547/how-to-combine-the-sequence-of-objects-in-jq-into-one-object