Reputation: 1
I have been trying to understand jq
, and the following piuzzle is giving me a headache: I can construct two expressions, A
and B
, which seem to produce the same output. And yet, when I surround them with []
array construction braces (as in [A]
and [B]
), they produce different output. In this case, the expressions are:
A := jq '. | add'
B := jq -s `.[] | add`
Concretely:
$ echo '[1,2] [3,4]' | jq '.'
[1,2]
[3,4]
$ echo '[1,2] [3,4]' | jq '. | add'
3
7
# Now surround with array construction and we get two values:
$ echo '[1,2] [3,4]' | jq '[. | add]'
[3]
[7]
$ echo '[1,2] [3,4]' | jq -s '.[]'
[1,2]
[3,4]
$ echo '[1,2] [3,4]' | jq -s '.[] | add'
3
7
# Now surround with array construction and we get only one value:
$ echo '[1,2] [3,4]' | jq -s '[.[] | add]'
[3,7]
What is going on here? Why is it that the B
expression, which applies the --slurp
setting but appears to produce identical intermediate output to the A
expression, produces different output when surrounded with []
array construction brackets?
Upvotes: 0
Views: 112
Reputation: 36391
When jq
is fed with a stream, just like [1,2] [3,4]
with two inputs, it executes the filter independently for each. That's why jq '[. | add]'
will produce two results; each addition will separately be wrapped into an array.
When jq
is given the --slurp
option, it combines the stream to an array, rendering it just one input. Therefore jq -s '[.[] | add]'
will have one result only; the multiple additions will be caught by the array constructor, which is executed just once.
Upvotes: 1