Improve manual in various ways (inputs, sort_by, foreach sections, etc.) (#2744)
- Add error/0 and mentions null input behavior (close #2231) - Explain value iterator suffix syntax .foo[] (close #1047) - Mention array slicing is also zero-based (close #2094) - Add examples of input and inputs filters (close #2216, close #2470) - Improve sort_by about multiple values (close #2103, close #2467, close #2474) - Improve foreach section and simplify examples (close #1148, close #2169) - Fix recurse/1 document on how it is identical using recurse/2 (close #2036, close #2412) - Add non-string examples of index/1, rindex/1 (close #1422) - Simplify the example of truncate_stream/1 (close #1736)
This commit is contained in:
1 parent
1cf6515c06
commit
ed334b536f
9 files changed
+703
-307
No files matched your search
@@ -155,7 +155,7 @@ body:
|
||||
You can build it using the usual `./configure && make && sudo
|
||||
make install` rigmarole.
|
||||
|
||||
If you're interested in using the lastest development version, try:
|
||||
If you're interested in using the latest development version, try:
|
||||
|
||||
git clone --recursive https://github.com/jqlang/jq.git
|
||||
cd jq
|
||||
|
||||
+140
-66
@@ -79,8 +79,8 @@ sections:
|
||||
jq filters run on a stream of JSON data. The input to jq is
|
||||
parsed as a sequence of whitespace-separated JSON values which
|
||||
are passed through the provided filter one at a time. The
|
||||
output(s) of the filter are written to standard out, again as a
|
||||
sequence of whitespace-separated JSON data.
|
||||
output(s) of the filter are written to standard output, as a
|
||||
sequence of newline-separated JSON data.
|
||||
|
||||
Note: it is important to mind the shell's quoting rules. As a
|
||||
general rule it's best to always quote (with single-quote
|
||||
@@ -132,7 +132,7 @@ sections:
|
||||
|
||||
* `--stream-errors`:
|
||||
|
||||
Like `--stream`, but invalid JSON inputs yield array calues
|
||||
Like `--stream`, but invalid JSON inputs yield array values
|
||||
where the first element is the error and the second is a path.
|
||||
For example, `["a",n]` produces ["Invalid literal at line 1,
|
||||
column 9",[1]]`.
|
||||
@@ -334,7 +334,7 @@ sections:
|
||||
input, jq processing can sometimes make it appear as though
|
||||
it does. For example, using the current implementation of
|
||||
jq, we would see that the expression:
|
||||
|
||||
|
||||
1E1234567890 | .
|
||||
|
||||
produces `1.7976931348623157e+308` on at least one platform.
|
||||
@@ -372,7 +372,7 @@ sections:
|
||||
output: ['"Hello, world!"']
|
||||
|
||||
- program: '.'
|
||||
input: '0.12345678901234567890123456789'
|
||||
input: '0.12345678901234567890123456789'
|
||||
output: ['0.12345678901234567890123456789']
|
||||
|
||||
- program: '[., tojson]'
|
||||
@@ -398,7 +398,7 @@ sections:
|
||||
JSON object (aka dictionary or hash) as input, `.foo` produces
|
||||
the value at the key "foo" if the key is present, or null otherwise.
|
||||
|
||||
A filter of the form `.foo.bar` is equivalent to `.foo|.bar`.
|
||||
A filter of the form `.foo.bar` is equivalent to `.foo | .bar`.
|
||||
|
||||
The `.foo` syntax only works for simple, identifier-like keys, that
|
||||
is, keys that are all made of alphanumeric characters and
|
||||
@@ -484,6 +484,7 @@ sections:
|
||||
Either index may be negative (in which case it counts
|
||||
backwards from the end of the array), or omitted (in which
|
||||
case it refers to the start or end of the array).
|
||||
Indices are zero-based.
|
||||
|
||||
examples:
|
||||
- program: '.[2:4]'
|
||||
@@ -509,7 +510,8 @@ sections:
|
||||
entirely, it will return *all* of the elements of an
|
||||
array. Running `.[]` with the input `[1,2,3]` will produce the
|
||||
numbers as three separate results, rather than as a single
|
||||
array.
|
||||
array. A filter of the form `.foo[]` is equivalent to
|
||||
`.foo | .[]`.
|
||||
|
||||
You can also use this on an object, and it will return all
|
||||
the values of the object.
|
||||
@@ -525,6 +527,10 @@ sections:
|
||||
input: '[]'
|
||||
output: []
|
||||
|
||||
- program: '.foo[]'
|
||||
input: '{"foo":[1,2,3]}'
|
||||
output: ['1','2','3']
|
||||
|
||||
- program: '.[]'
|
||||
input: '{"a": 1, "b": 1}'
|
||||
output: ['1', '1']
|
||||
@@ -533,7 +539,8 @@ sections:
|
||||
body: |
|
||||
|
||||
Like `.[]`, but no errors will be output if . is not an array
|
||||
or object.
|
||||
or object. A filter of the form `.foo[]?` is equivalent to
|
||||
`.foo | .[]?`.
|
||||
|
||||
- title: "Comma: `,`"
|
||||
body: |
|
||||
@@ -728,15 +735,15 @@ sections:
|
||||
Recursively descends `.`, producing every value. This is the
|
||||
same as the zero-argument `recurse` builtin (see below). This
|
||||
is intended to resemble the XPath `//` operator. Note that
|
||||
`..a` does not work; use `..|.a` instead. In the example
|
||||
below we use `..|.a?` to find all the values of object keys
|
||||
`..a` does not work; use `.. | .a` instead. In the example
|
||||
below we use `.. | .a?` to find all the values of object keys
|
||||
"a" in any object found "below" `.`.
|
||||
|
||||
This is particularly useful in conjunction with `path(EXP)`
|
||||
(also see below) and the `?` operator.
|
||||
|
||||
examples:
|
||||
- program: '..|.a?'
|
||||
- program: '.. | .a?'
|
||||
input: '[[{"a":1}]]'
|
||||
output: ['1']
|
||||
|
||||
@@ -1190,12 +1197,25 @@ sections:
|
||||
input: 'null'
|
||||
output: ['[1,2,3]']
|
||||
|
||||
- title: "`error(message)`"
|
||||
- title: "`error`, `error(message)`"
|
||||
body: |
|
||||
|
||||
Produces an error, just like `.a` applied to values other than
|
||||
null and objects would, but with the given message as the
|
||||
error's value. Errors can be caught with try/catch; see below.
|
||||
Produces an error with the input value, or with the message
|
||||
given as the argument. Errors can be caught with try/catch;
|
||||
see below.
|
||||
|
||||
When the error value is `null`, it produces nothing and works
|
||||
just like `empty`. So `[null | error]` and `[error(null)]` both
|
||||
emit `[]`.
|
||||
|
||||
examples:
|
||||
- program: 'try error catch .'
|
||||
input: '"error message"'
|
||||
output: ['"error message"']
|
||||
|
||||
- program: 'try error("invalid value: \(.)") catch .'
|
||||
input: '42'
|
||||
output: ['"invalid value: 42"']
|
||||
|
||||
- title: "`halt`"
|
||||
body: |
|
||||
@@ -1481,19 +1501,25 @@ sections:
|
||||
sorted order), and if their keys are equal then the values
|
||||
are compared key by key.
|
||||
|
||||
`sort` may be used to sort by a particular field of an
|
||||
object, or by applying any jq filter.
|
||||
|
||||
`sort_by(f)` compares two elements by comparing the result of
|
||||
`f` on each element.
|
||||
`sort_by` may be used to sort by a particular field of an
|
||||
object, or by applying any jq filter. `sort_by(f)` compares
|
||||
two elements by comparing the result of `f` on each element.
|
||||
When `f` produces multiple values, it firstly compares the
|
||||
first values, and the second values if the first values are
|
||||
equal, and so on.
|
||||
|
||||
examples:
|
||||
- program: 'sort'
|
||||
input: '[8,3,null,6]'
|
||||
output: ['[null,3,6,8]']
|
||||
|
||||
- program: 'sort_by(.foo)'
|
||||
input: '[{"foo":4, "bar":10}, {"foo":3, "bar":100}, {"foo":2, "bar":1}]'
|
||||
output: ['[{"foo":2, "bar":1}, {"foo":3, "bar":100}, {"foo":4, "bar":10}]']
|
||||
input: '[{"foo":4, "bar":10}, {"foo":3, "bar":10}, {"foo":2, "bar":1}]'
|
||||
output: ['[{"foo":2, "bar":1}, {"foo":3, "bar":10}, {"foo":4, "bar":10}]']
|
||||
|
||||
- program: 'sort_by(.foo, .bar)'
|
||||
input: '[{"foo":4, "bar":10}, {"foo":3, "bar":20}, {"foo":2, "bar":1}, {"foo":3, "bar":10}]'
|
||||
output: ['[{"foo":2, "bar":1}, {"foo":3, "bar":10}, {"foo":3, "bar":20}, {"foo":4, "bar":10}]']
|
||||
|
||||
- title: "`group_by(path_expression)`"
|
||||
body: |
|
||||
@@ -1620,9 +1646,21 @@ sections:
|
||||
- program: 'index(", ")'
|
||||
input: '"a,b, cd, efg, hijk"'
|
||||
output: ['3']
|
||||
- program: 'index(1)'
|
||||
input: '[0,1,2,1,3,1,4]'
|
||||
output: ['1']
|
||||
- program: 'index([1,2])'
|
||||
input: '[0,1,2,3,1,4,2,5,1,2,6,7]'
|
||||
output: ['1']
|
||||
- program: 'rindex(", ")'
|
||||
input: '"a,b, cd, efg, hijk"'
|
||||
output: ['12']
|
||||
- program: 'rindex(1)'
|
||||
input: '[0,1,2,1,3,1,4]'
|
||||
output: ['5']
|
||||
- program: 'rindex([1,2])'
|
||||
input: '[0,1,2,3,1,4,2,5,1,2,6,7]'
|
||||
output: ['8']
|
||||
|
||||
- title: "`inside`"
|
||||
body: |
|
||||
@@ -1846,7 +1884,7 @@ sections:
|
||||
When called without an argument, `recurse` is equivalent to
|
||||
`recurse(.[]?)`.
|
||||
|
||||
`recurse(f)` is identical to `recurse(f; . != null)` and can be
|
||||
`recurse(f)` is identical to `recurse(f; true)` and can be
|
||||
used without concerns about recursion depth.
|
||||
|
||||
`recurse(f; condition)` is a generator which begins by
|
||||
@@ -2861,29 +2899,6 @@ sections:
|
||||
$times_three | [. + $times_three]) | ...`: here the binding
|
||||
`$times_three` is _not_ visible past the closing parenthesis.
|
||||
|
||||
- title: Reduce
|
||||
body: |
|
||||
|
||||
The `reduce` syntax in jq allows you to combine all of the
|
||||
results of an expression by accumulating them into a single
|
||||
answer. As an example, we'll pass `[3,2,1]` to this expression:
|
||||
|
||||
reduce .[] as $item (0; . + $item)
|
||||
|
||||
For each result that `.[]` produces, `. + $item` is run to
|
||||
accumulate a running total, starting from 0. In this
|
||||
example, `.[]` produces the results 3, 2, and 1, so the
|
||||
effect is similar to running something like this:
|
||||
|
||||
0 | (3 as $item | . + $item) |
|
||||
(2 as $item | . + $item) |
|
||||
(1 as $item | . + $item)
|
||||
|
||||
examples:
|
||||
- program: 'reduce .[] as $item (0; . + $item)'
|
||||
input: '[10,2,5,3]'
|
||||
output: ['20']
|
||||
|
||||
- title: "`isempty(exp)`"
|
||||
body: |
|
||||
|
||||
@@ -2894,6 +2909,14 @@ sections:
|
||||
input: 'null'
|
||||
output: ['true']
|
||||
|
||||
- program: 'isempty(.[])'
|
||||
input: '[]'
|
||||
output: ['true']
|
||||
|
||||
- program: 'isempty(.[])'
|
||||
input: '[1,2,3]'
|
||||
output: ['false']
|
||||
|
||||
- title: "`limit(n; exp)`"
|
||||
body: |
|
||||
|
||||
@@ -2931,32 +2954,79 @@ sections:
|
||||
input: '10'
|
||||
output: ['[0,9,5]']
|
||||
|
||||
- title: "`reduce`"
|
||||
body: |
|
||||
|
||||
The `reduce` syntax allows you to combine all of the results of
|
||||
an expression by accumulating them into a single answer.
|
||||
The form is `reduce EXP as $var (INIT; UPDATE)`.
|
||||
As an example, we'll pass `[1,2,3]` to this expression:
|
||||
|
||||
reduce .[] as $item (0; . + $item)
|
||||
|
||||
For each result that `.[]` produces, `. + $item` is run to
|
||||
accumulate a running total, starting from 0 as the input value.
|
||||
In this example, `.[]` produces the results `1`, `2`, and `3`,
|
||||
so the effect is similar to running something like this:
|
||||
|
||||
0 | 1 as $item | . + $item |
|
||||
2 as $item | . + $item |
|
||||
3 as $item | . + $item
|
||||
|
||||
examples:
|
||||
- program: 'reduce .[] as $item (0; . + $item)'
|
||||
input: '[1,2,3,4,5]'
|
||||
output: ['15']
|
||||
|
||||
- program: 'reduce .[] as [$i,$j] (0; . + $i * $j)'
|
||||
input: '[[1,2],[3,4],[5,6]]'
|
||||
output: ['44']
|
||||
|
||||
- program: 'reduce .[] as {$x,$y} (null; .x += $x | .y += [$y])'
|
||||
input: '[{"x":"a","y":1},{"x":"b","y":2},{"x":"c","y":3}]'
|
||||
output: ['{"x":"abc","y":[1,2,3]}']
|
||||
|
||||
- title: "`foreach`"
|
||||
body: |
|
||||
|
||||
The `foreach` syntax is similar to `reduce`, but intended to
|
||||
allow the construction of `limit` and reducers that produce
|
||||
intermediate results (see example).
|
||||
intermediate results.
|
||||
|
||||
The form is `foreach EXP as $var (INIT; UPDATE; EXTRACT)`.
|
||||
Like `reduce`, `INIT` is evaluated once to produce a state
|
||||
value, then each output of `EXP` is bound to `$var`, `UPDATE`
|
||||
is evaluated for each output of `EXP` with the current state
|
||||
and with `$var` visible. Each value output by `UPDATE`
|
||||
replaces the previous state. Finally, `EXTRACT` is evaluated
|
||||
for each new state to extract an output of `foreach`.
|
||||
As an example, we'll pass `[1,2,3]` to this expression:
|
||||
|
||||
This is mostly useful only for constructing `reduce`- and
|
||||
`limit`-like functions. But it is much more general, as it
|
||||
allows for partial reductions (see the example below).
|
||||
foreach .[] as $item (0; . + $item; [$item, . * 2])
|
||||
|
||||
Like the `reduce` syntax, `. + $item` is run for each result
|
||||
that `.[]` produces, but `[$item, . * 2]` is run for each
|
||||
intermediate values. In this example, since the intermediate
|
||||
values are `1`, `3`, and `6`, the `foreach` expression produces
|
||||
`[1,2]`, `[2,6]`, and `[3,12]`. So the effect is similar
|
||||
to running something like this:
|
||||
|
||||
0 | 1 as $item | . + $item | [$item, . * 2],
|
||||
2 as $item | . + $item | [$item, . * 2],
|
||||
3 as $item | . + $item | [$item, . * 2]
|
||||
|
||||
When `EXTRACT` is omitted, the identity filter is used.
|
||||
That is, it outputs the intermediate values as they are.
|
||||
|
||||
examples:
|
||||
- program: '[foreach .[] as $item
|
||||
([[],[]];
|
||||
if $item == null then [[],.[0]] else [(.[0] + [$item]),[]] end;
|
||||
if $item == null then .[1] else empty end)]'
|
||||
input: '[1,2,3,4,null,"a","b",null]'
|
||||
output: ['[[1,2,3,4],["a","b"]]']
|
||||
- program: 'foreach .[] as $item (0; . + $item)'
|
||||
input: '[1,2,3,4,5]'
|
||||
output: ['1','3','6','10','15']
|
||||
|
||||
- program: 'foreach .[] as $item (0; . + $item; [$item, . * 2])'
|
||||
input: '[1,2,3,4,5]'
|
||||
output: ['[1,2]','[2,6]','[3,12]','[4,20]','[5,30]']
|
||||
|
||||
- program: 'foreach .[] as $item (0; . + 1; {index: ., $item})'
|
||||
input: '["foo", "bar", "baz"]'
|
||||
output:
|
||||
- '{"index":1,"item":"foo"}'
|
||||
- '{"index":2,"item":"bar"}'
|
||||
- '{"index":3,"item":"baz"}'
|
||||
|
||||
- title: Recursion
|
||||
body: |
|
||||
@@ -3098,9 +3168,11 @@ sections:
|
||||
Outputs one new input.
|
||||
|
||||
Note that when using `input` it is generally be necessary to
|
||||
invoke jq with the -n command-line option, otherwise
|
||||
invoke jq with the `-n` command-line option, otherwise
|
||||
the first entity will be lost.
|
||||
|
||||
echo 1 2 3 4 | jq '[., input]' # [1,2] [3,4]
|
||||
|
||||
- title: "`inputs`"
|
||||
body: |
|
||||
|
||||
@@ -3108,9 +3180,11 @@ sections:
|
||||
|
||||
This is primarily useful for reductions over a program's
|
||||
inputs. Note that when using `inputs` it is generally necessary
|
||||
to invoke jq with the -n command-line option, otherwise
|
||||
to invoke jq with the `-n` command-line option, otherwise
|
||||
the first entity will be lost.
|
||||
|
||||
echo 1 2 3 | jq -n 'reduce inputs as $i (0; . + $i)' # 6
|
||||
|
||||
- title: "`debug`, `debug(msgs)`"
|
||||
body: |
|
||||
|
||||
@@ -3188,9 +3262,9 @@ sections:
|
||||
given streaming expression.
|
||||
|
||||
examples:
|
||||
- program: '[1|truncate_stream([[0],1],[[1,0],2],[[1,0]],[[1]])]'
|
||||
- program: 'truncate_stream([[0],1],[[1,0],2],[[1,0]],[[1]])'
|
||||
input: '1'
|
||||
output: ['[[[0],2],[[0]]]']
|
||||
output: ['[[0],2]', '[[0]]']
|
||||
|
||||
- title: "`fromstream(stream_expression)`"
|
||||
body: |
|
||||
|
||||
@@ -76,8 +76,8 @@ sections:
|
||||
jq filters run on a stream of JSON data. The input to jq is
|
||||
parsed as a sequence of whitespace-separated JSON values which
|
||||
are passed through the provided filter one at a time. The
|
||||
output(s) of the filter are written to standard out, again as a
|
||||
sequence of whitespace-separated JSON data.
|
||||
output(s) of the filter are written to standard output, as a
|
||||
sequence of newline-separated JSON data.
|
||||
|
||||
You can affect how jq reads and writes its input and output
|
||||
using some command-line options:
|
||||
@@ -172,9 +172,8 @@ sections:
|
||||
|
||||
You can also look up fields of an object using syntax like
|
||||
`.["foo"]` (`.foo` above is a shorthand version of this). This
|
||||
one works for arrays as well, if the key is an
|
||||
integer. Arrays are zero-based (like javascript), so `.[2]`
|
||||
returns the third element of the array.
|
||||
one works for arrays as well, if the key is an integer. Arrays
|
||||
are zero-based, so `.[2]` returns the third element of the array.
|
||||
|
||||
The `.[10:15]` syntax can be used to return a subarray of an
|
||||
array. The array returned by `.[10:15]` will be of length 5,
|
||||
@@ -279,7 +278,7 @@ sections:
|
||||
hashes with only string keys), and "null".
|
||||
|
||||
Booleans, null, strings and numbers are written the same way as
|
||||
in javascript. Just like everything else in jq, these simple
|
||||
in JSON. Just like everything else in jq, these simple
|
||||
values take an input and produce an output - `42` is a valid jq
|
||||
expression that takes an input, ignores it, and returns 42
|
||||
instead.
|
||||
@@ -907,7 +906,7 @@ sections:
|
||||
means that you'll sometimes have to be more explicit about
|
||||
the condition you want: you can't test whether, e.g. a
|
||||
string is empty using `if .name then A else B end`, you'll
|
||||
need something more like `if (.name | count) > 0 then A else
|
||||
need something more like `if (.name | length) > 0 then A else
|
||||
B end` instead.
|
||||
|
||||
If the condition `A` produces multiple results, then `B` is evaluated
|
||||
@@ -1040,7 +1039,7 @@ sections:
|
||||
produces its sum, and the `length` expression is given the array and
|
||||
produces its length.
|
||||
|
||||
So, there's generally a cleaner way to solve most problems in jq that
|
||||
So, there's generally a cleaner way to solve most problems in jq than
|
||||
defining variables. Still, sometimes they do make things easier, so jq
|
||||
lets you define variables using `expression as $variable`. All
|
||||
variable names start with `$`. Here's a slightly uglier version of the
|
||||
@@ -1128,29 +1127,29 @@ sections:
|
||||
input: '[[1,2],[10,20]]'
|
||||
output: ['[[1,2,1,2], [10,20,1,2]]']
|
||||
|
||||
- title: Reduce
|
||||
- title: "`reduce`"
|
||||
body: |
|
||||
|
||||
The `reduce` syntax in jq allows you to combine all of the
|
||||
results of an expression by accumulating them into a single
|
||||
answer. As an example, we'll pass `[3,2,1]` to this expression:
|
||||
The `reduce` syntax allows you to combine all of the results of
|
||||
an expression by accumulating them into a single answer.
|
||||
The form is `reduce EXP as $var (INIT; UPDATE)`.
|
||||
As an example, we'll pass `[1,2,3]` to this expression:
|
||||
|
||||
reduce .[] as $item (0; . + $item)
|
||||
|
||||
For each result that `.[]` produces, `. + $item` is run to
|
||||
accumulate a running total, starting from 0. In this
|
||||
example, `.[]` produces the results 3, 2, and 1, so the
|
||||
effect is similar to running something like this:
|
||||
accumulate a running total, starting from 0 as the input value.
|
||||
In this example, `.[]` produces the results `1`, `2`, and `3`,
|
||||
so the effect is similar to running something like this:
|
||||
|
||||
0 | (3 as $item | . + $item) |
|
||||
(2 as $item | . + $item) |
|
||||
(1 as $item | . + $item)
|
||||
0 | 1 as $item | . + $item |
|
||||
2 as $item | . + $item |
|
||||
3 as $item | . + $item
|
||||
|
||||
examples:
|
||||
- program: 'reduce .[] as $item (0; . + $item)'
|
||||
input: '[10,2,5,3]'
|
||||
output: ['20']
|
||||
|
||||
input: '[1,2,3,4,5]'
|
||||
output: ['15']
|
||||
|
||||
- title: Assignment
|
||||
body: |
|
||||
|
||||
@@ -76,8 +76,8 @@ sections:
|
||||
jq filters run on a stream of JSON data. The input to jq is
|
||||
parsed as a sequence of whitespace-separated JSON values which
|
||||
are passed through the provided filter one at a time. The
|
||||
output(s) of the filter are written to standard out, again as a
|
||||
sequence of whitespace-separated JSON data.
|
||||
output(s) of the filter are written to standard output, as a
|
||||
sequence of newline-separated JSON data.
|
||||
|
||||
Note: it is important to mind the shell's quoting rules. As a
|
||||
general rule it's best to always quote (with single-quote
|
||||
@@ -253,9 +253,8 @@ sections:
|
||||
|
||||
You can also look up fields of an object using syntax like
|
||||
`.["foo"]` (`.foo` above is a shorthand version of this). This
|
||||
one works for arrays as well, if the key is an
|
||||
integer. Arrays are zero-based (like javascript), so `.[2]`
|
||||
returns the third element of the array.
|
||||
one works for arrays as well, if the key is an integer. Arrays
|
||||
are zero-based, so `.[2]` returns the third element of the array.
|
||||
|
||||
The `.[10:15]` syntax can be used to return a subarray of an
|
||||
array or substring of a string. The array returned by
|
||||
@@ -263,7 +262,7 @@ sections:
|
||||
index 10 (inclusive) to index 15 (exclusive). Either index may
|
||||
be negative (in which case it counts backwards from the end of
|
||||
the array), or omitted (in which case it refers to the start
|
||||
or end of the array).
|
||||
or end of the array). Indices are zero-based.
|
||||
|
||||
The `?` "operator" can also be used with the slice operator,
|
||||
as in `.[10:15]?`, which outputs values where the inputs are
|
||||
@@ -375,7 +374,7 @@ sections:
|
||||
hashes with only string keys), and "null".
|
||||
|
||||
Booleans, null, strings and numbers are written the same way as
|
||||
in javascript. Just like everything else in jq, these simple
|
||||
in JSON. Just like everything else in jq, these simple
|
||||
values take an input and produce an output - `42` is a valid jq
|
||||
expression that takes an input, ignores it, and returns 42
|
||||
instead.
|
||||
@@ -1530,29 +1529,29 @@ sections:
|
||||
input: '[[1,2],[10,20]]'
|
||||
output: ['[[1,2,1,2], [10,20,1,2]]']
|
||||
|
||||
- title: Reduce
|
||||
- title: "`reduce`"
|
||||
body: |
|
||||
|
||||
The `reduce` syntax in jq allows you to combine all of the
|
||||
results of an expression by accumulating them into a single
|
||||
answer. As an example, we'll pass `[3,2,1]` to this expression:
|
||||
The `reduce` syntax allows you to combine all of the results of
|
||||
an expression by accumulating them into a single answer.
|
||||
The form is `reduce EXP as $var (INIT; UPDATE)`.
|
||||
As an example, we'll pass `[1,2,3]` to this expression:
|
||||
|
||||
reduce .[] as $item (0; . + $item)
|
||||
|
||||
For each result that `.[]` produces, `. + $item` is run to
|
||||
accumulate a running total, starting from 0. In this
|
||||
example, `.[]` produces the results 3, 2, and 1, so the
|
||||
effect is similar to running something like this:
|
||||
accumulate a running total, starting from 0 as the input value.
|
||||
In this example, `.[]` produces the results `1`, `2`, and `3`,
|
||||
so the effect is similar to running something like this:
|
||||
|
||||
0 | (3 as $item | . + $item) |
|
||||
(2 as $item | . + $item) |
|
||||
(1 as $item | . + $item)
|
||||
0 | 1 as $item | . + $item |
|
||||
2 as $item | . + $item |
|
||||
3 as $item | . + $item
|
||||
|
||||
examples:
|
||||
- program: 'reduce .[] as $item (0; . + $item)'
|
||||
input: '[10,2,5,3]'
|
||||
output: ['20']
|
||||
|
||||
input: '[1,2,3,4,5]'
|
||||
output: ['15']
|
||||
|
||||
- title: Assignment
|
||||
body: |
|
||||
|
||||
@@ -78,8 +78,8 @@ sections:
|
||||
jq filters run on a stream of JSON data. The input to jq is
|
||||
parsed as a sequence of whitespace-separated JSON values which
|
||||
are passed through the provided filter one at a time. The
|
||||
output(s) of the filter are written to standard out, again as a
|
||||
sequence of whitespace-separated JSON data.
|
||||
output(s) of the filter are written to standard output, as a
|
||||
sequence of newline-separated JSON data.
|
||||
|
||||
Note: it is important to mind the shell's quoting rules. As a
|
||||
general rule it's best to always quote (with single-quote
|
||||
@@ -319,9 +319,8 @@ sections:
|
||||
|
||||
You can also look up fields of an object using syntax like
|
||||
`.["foo"]` (`.foo` above is a shorthand version of this). This
|
||||
one works for arrays as well, if the key is an
|
||||
integer. Arrays are zero-based (like javascript), so `.[2]`
|
||||
returns the third element of the array.
|
||||
one works for arrays as well, if the key is an integer. Arrays
|
||||
are zero-based, so `.[2]` returns the third element of the array.
|
||||
|
||||
The `.[10:15]` syntax can be used to return a subarray of an
|
||||
array or substring of a string. The array returned by
|
||||
@@ -329,7 +328,7 @@ sections:
|
||||
index 10 (inclusive) to index 15 (exclusive). Either index may
|
||||
be negative (in which case it counts backwards from the end of
|
||||
the array), or omitted (in which case it refers to the start
|
||||
or end of the array).
|
||||
or end of the array). Indices are zero-based.
|
||||
|
||||
The `.[2]` syntax can be used to return the element at the
|
||||
given index. Negative indices are allowed, with -1 referring
|
||||
@@ -382,7 +381,8 @@ sections:
|
||||
entirely, it will return *all* of the elements of an
|
||||
array. Running `.[]` with the input `[1,2,3]` will produce the
|
||||
numbers as three separate results, rather than as a single
|
||||
array.
|
||||
array. A filter of the form `.foo[]` is equivalent to
|
||||
`.foo | .[]`.
|
||||
|
||||
You can also use this on an object, and it will return all
|
||||
the values of the object.
|
||||
@@ -398,6 +398,10 @@ sections:
|
||||
input: '[]'
|
||||
output: []
|
||||
|
||||
- program: '.foo[]'
|
||||
input: '{"foo":[1,2,3]}'
|
||||
output: ['1','2','3']
|
||||
|
||||
- program: '.[]'
|
||||
input: '{"a": 1, "b": 1}'
|
||||
output: ['1', '1']
|
||||
@@ -406,7 +410,8 @@ sections:
|
||||
body: |
|
||||
|
||||
Like `.[]`, but no errors will be output if . is not an array
|
||||
or object.
|
||||
or object. A filter of the form `.foo[]?` is equivalent to
|
||||
`.foo | .[]?`.
|
||||
|
||||
- title: "`,`"
|
||||
body: |
|
||||
@@ -456,7 +461,7 @@ sections:
|
||||
hashes with only string keys), and "null".
|
||||
|
||||
Booleans, null, strings and numbers are written the same way as
|
||||
in javascript. Just like everything else in jq, these simple
|
||||
in JSON. Just like everything else in jq, these simple
|
||||
values take an input and produce an output - `42` is a valid jq
|
||||
expression that takes an input, ignores it, and returns 42
|
||||
instead.
|
||||
@@ -843,12 +848,25 @@ sections:
|
||||
input: 'null'
|
||||
output: ['[1,2,3]']
|
||||
|
||||
- title: "`error(message)`"
|
||||
- title: "`error`, `error(message)`"
|
||||
body: |
|
||||
|
||||
Produces an error, just like `.a` applied to values other than
|
||||
null and objects would, but with the given message as the
|
||||
error's value.
|
||||
Produces an error with the input value, or with the message
|
||||
given as the argument. Errors can be caught with try/catch;
|
||||
see below.
|
||||
|
||||
When the error value is `null`, it produces nothing and works
|
||||
just like `empty`. So `[null | error]` and `[error(null)]` both
|
||||
emit `[]`.
|
||||
|
||||
examples:
|
||||
- program: 'try error catch .'
|
||||
input: '"error message"'
|
||||
output: ['"error message"']
|
||||
|
||||
- program: 'try error("invalid value: \(.)") catch .'
|
||||
input: '42'
|
||||
output: ['"invalid value: 42"']
|
||||
|
||||
- title: "`$__loc__`"
|
||||
body: |
|
||||
@@ -1005,7 +1023,7 @@ sections:
|
||||
input: '[{"foo": "bar"}, [{"foo": "baz"}]]'
|
||||
output: ['[{"foo": "bar"}, {"foo": "baz"}]']
|
||||
|
||||
- title: "`range(upto)`, `range(from; upto)` `range(from; upto; by)`"
|
||||
- title: "`range(upto)`, `range(from; upto)`, `range(from; upto; by)`"
|
||||
body: |
|
||||
|
||||
The `range` function produces a range of numbers. `range(4; 10)`
|
||||
@@ -1141,19 +1159,25 @@ sections:
|
||||
sorted order), and if their keys are equal then the values
|
||||
are compared key by key.
|
||||
|
||||
`sort` may be used to sort by a particular field of an
|
||||
object, or by applying any jq filter.
|
||||
|
||||
`sort_by(f)` compares two elements by comparing the result of
|
||||
`f` on each element.
|
||||
`sort_by` may be used to sort by a particular field of an
|
||||
object, or by applying any jq filter. `sort_by(f)` compares
|
||||
two elements by comparing the result of `f` on each element.
|
||||
When `f` produces multiple values, it firstly compares the
|
||||
first values, and the second values if the first values are
|
||||
equal, and so on.
|
||||
|
||||
examples:
|
||||
- program: 'sort'
|
||||
input: '[8,3,null,6]'
|
||||
output: ['[null,3,6,8]']
|
||||
|
||||
- program: 'sort_by(.foo)'
|
||||
input: '[{"foo":4, "bar":10}, {"foo":3, "bar":100}, {"foo":2, "bar":1}]'
|
||||
output: ['[{"foo":2, "bar":1}, {"foo":3, "bar":100}, {"foo":4, "bar":10}]']
|
||||
input: '[{"foo":4, "bar":10}, {"foo":3, "bar":10}, {"foo":2, "bar":1}]'
|
||||
output: ['[{"foo":2, "bar":1}, {"foo":3, "bar":10}, {"foo":4, "bar":10}]']
|
||||
|
||||
- program: 'sort_by(.foo, .bar)'
|
||||
input: '[{"foo":4, "bar":10}, {"foo":3, "bar":20}, {"foo":2, "bar":1}, {"foo":3, "bar":10}]'
|
||||
output: ['[{"foo":2, "bar":1}, {"foo":3, "bar":10}, {"foo":3, "bar":20}, {"foo":4, "bar":10}]']
|
||||
|
||||
- title: "`group_by(path_expression)`"
|
||||
body: |
|
||||
@@ -1280,9 +1304,21 @@ sections:
|
||||
- program: 'index(", ")'
|
||||
input: '"a,b, cd, efg, hijk"'
|
||||
output: ['3']
|
||||
- program: 'index(1)'
|
||||
input: '[0,1,2,1,3,1,4]'
|
||||
output: ['1']
|
||||
- program: 'index([1,2])'
|
||||
input: '[0,1,2,3,1,4,2,5,1,2,6,7]'
|
||||
output: ['1']
|
||||
- program: 'rindex(", ")'
|
||||
input: '"a,b, cd, efg, hijk"'
|
||||
output: ['12']
|
||||
- program: 'rindex(1)'
|
||||
input: '[0,1,2,1,3,1,4]'
|
||||
output: ['5']
|
||||
- program: 'rindex([1,2])'
|
||||
input: '[0,1,2,3,1,4,2,5,1,2,6,7]'
|
||||
output: ['8']
|
||||
|
||||
- title: "`inside`"
|
||||
body: |
|
||||
@@ -2308,29 +2344,6 @@ sections:
|
||||
input: '[[1,2],[10,20]]'
|
||||
output: ['[[1,2,1,2], [10,20,1,2]]']
|
||||
|
||||
- title: Reduce
|
||||
body: |
|
||||
|
||||
The `reduce` syntax in jq allows you to combine all of the
|
||||
results of an expression by accumulating them into a single
|
||||
answer. As an example, we'll pass `[3,2,1]` to this expression:
|
||||
|
||||
reduce .[] as $item (0; . + $item)
|
||||
|
||||
For each result that `.[]` produces, `. + $item` is run to
|
||||
accumulate a running total, starting from 0. In this
|
||||
example, `.[]` produces the results 3, 2, and 1, so the
|
||||
effect is similar to running something like this:
|
||||
|
||||
0 | (3 as $item | . + $item) |
|
||||
(2 as $item | . + $item) |
|
||||
(1 as $item | . + $item)
|
||||
|
||||
examples:
|
||||
- program: 'reduce .[] as $item (0; . + $item)'
|
||||
input: '[10,2,5,3]'
|
||||
output: ['20']
|
||||
|
||||
- title: "`limit(n; exp)`"
|
||||
body: |
|
||||
|
||||
@@ -2370,32 +2383,79 @@ sections:
|
||||
input: '10'
|
||||
output: ['[0,9,5]']
|
||||
|
||||
- title: "`reduce`"
|
||||
body: |
|
||||
|
||||
The `reduce` syntax allows you to combine all of the results of
|
||||
an expression by accumulating them into a single answer.
|
||||
The form is `reduce EXP as $var (INIT; UPDATE)`.
|
||||
As an example, we'll pass `[1,2,3]` to this expression:
|
||||
|
||||
reduce .[] as $item (0; . + $item)
|
||||
|
||||
For each result that `.[]` produces, `. + $item` is run to
|
||||
accumulate a running total, starting from 0 as the input value.
|
||||
In this example, `.[]` produces the results `1`, `2`, and `3`,
|
||||
so the effect is similar to running something like this:
|
||||
|
||||
0 | 1 as $item | . + $item |
|
||||
2 as $item | . + $item |
|
||||
3 as $item | . + $item
|
||||
|
||||
examples:
|
||||
- program: 'reduce .[] as $item (0; . + $item)'
|
||||
input: '[1,2,3,4,5]'
|
||||
output: ['15']
|
||||
|
||||
- program: 'reduce .[] as [$i,$j] (0; . + $i * $j)'
|
||||
input: '[[1,2],[3,4],[5,6]]'
|
||||
output: ['44']
|
||||
|
||||
- program: 'reduce .[] as {$x,$y} (null; .x += $x | .y += [$y])'
|
||||
input: '[{"x":"a","y":1},{"x":"b","y":2},{"x":"c","y":3}]'
|
||||
output: ['{"x":"abc","y":[1,2,3]}']
|
||||
|
||||
- title: "`foreach`"
|
||||
body: |
|
||||
|
||||
The `foreach` syntax is similar to `reduce`, but intended to
|
||||
allow the construction of `limit` and reducers that produce
|
||||
intermediate results (see example).
|
||||
intermediate results.
|
||||
|
||||
The form is `foreach EXP as $var (INIT; UPDATE; EXTRACT)`.
|
||||
Like `reduce`, `INIT` is evaluated once to produce a state
|
||||
value, then each output of `EXP` is bound to `$var`, `UPDATE`
|
||||
is evaluated for each output of `EXP` with the current state
|
||||
and with `$var` visible. Each value output by `UPDATE`
|
||||
replaces the previous state. Finally, `EXTRACT` is evaluated
|
||||
for each new state to extract an output of `foreach`.
|
||||
As an example, we'll pass `[1,2,3]` to this expression:
|
||||
|
||||
This is mostly useful only for constructing `reduce`- and
|
||||
`limit`-like functions. But it is much more general, as it
|
||||
allows for partial reductions (see the example below).
|
||||
foreach .[] as $item (0; . + $item; [$item, . * 2])
|
||||
|
||||
Like the `reduce` syntax, `. + $item` is run for each result
|
||||
that `.[]` produces, but `[$item, . * 2]` is run for each
|
||||
intermediate values. In this example, since the intermediate
|
||||
values are `1`, `3`, and `6`, the `foreach` expression produces
|
||||
`[1,2]`, `[2,6]`, and `[3,12]`. So the effect is similar
|
||||
to running something like this:
|
||||
|
||||
0 | 1 as $item | . + $item | [$item, . * 2],
|
||||
2 as $item | . + $item | [$item, . * 2],
|
||||
3 as $item | . + $item | [$item, . * 2]
|
||||
|
||||
When `EXTRACT` is omitted, the identity filter is used.
|
||||
That is, it outputs the intermediate values as they are.
|
||||
|
||||
examples:
|
||||
- program: '[foreach .[] as $item
|
||||
([[],[]];
|
||||
if $item == null then [[],.[0]] else [(.[0] + [$item]),[]] end;
|
||||
if $item == null then .[1] else empty end)]'
|
||||
input: '[1,2,3,4,null,"a","b",null]'
|
||||
output: ['[[1,2,3,4],["a","b"]]']
|
||||
- program: 'foreach .[] as $item (0; . + $item)'
|
||||
input: '[1,2,3,4,5]'
|
||||
output: ['1','3','6','10','15']
|
||||
|
||||
- program: 'foreach .[] as $item (0; . + $item; [$item, . * 2])'
|
||||
input: '[1,2,3,4,5]'
|
||||
output: ['[1,2]','[2,6]','[3,12]','[4,20]','[5,30]']
|
||||
|
||||
- program: 'foreach .[] as $item (0; . + 1; {index: ., $item})'
|
||||
input: '["foo", "bar", "baz"]'
|
||||
output:
|
||||
- '{"index":1,"item":"foo"}'
|
||||
- '{"index":2,"item":"bar"}'
|
||||
- '{"index":3,"item":"baz"}'
|
||||
|
||||
- title: Recursion
|
||||
body: |
|
||||
@@ -2511,6 +2571,8 @@ sections:
|
||||
|
||||
Outputs one new input.
|
||||
|
||||
echo 1 2 3 4 | jq '[., input]' # [1,2] [3,4]
|
||||
|
||||
- title: "`inputs`"
|
||||
body: |
|
||||
|
||||
@@ -2519,6 +2581,8 @@ sections:
|
||||
This is primarily useful for reductions over a program's
|
||||
inputs.
|
||||
|
||||
echo 1 2 3 | jq -n 'reduce inputs as $i (0; . + $i)' # 6
|
||||
|
||||
- title: "`debug`"
|
||||
body: |
|
||||
|
||||
@@ -2571,9 +2635,9 @@ sections:
|
||||
given streaming expression.
|
||||
|
||||
examples:
|
||||
- program: '[1|truncate_stream([[0],1],[[1,0],2],[[1,0]],[[1]])]'
|
||||
- program: 'truncate_stream([[0],1],[[1,0],2],[[1,0]],[[1]])'
|
||||
input: '1'
|
||||
output: ['[[[0],2],[[0]]]']
|
||||
output: ['[[0],2]', '[[0]]']
|
||||
|
||||
- title: "`fromstream(stream_expression)`"
|
||||
body: |
|
||||
|
||||
@@ -78,8 +78,8 @@ sections:
|
||||
jq filters run on a stream of JSON data. The input to jq is
|
||||
parsed as a sequence of whitespace-separated JSON values which
|
||||
are passed through the provided filter one at a time. The
|
||||
output(s) of the filter are written to standard out, again as a
|
||||
sequence of whitespace-separated JSON data.
|
||||
output(s) of the filter are written to standard output, as a
|
||||
sequence of newline-separated JSON data.
|
||||
|
||||
Note: it is important to mind the shell's quoting rules. As a
|
||||
general rule it's best to always quote (with single-quote
|
||||
@@ -397,6 +397,7 @@ sections:
|
||||
Either index may be negative (in which case it counts
|
||||
backwards from the end of the array), or omitted (in which
|
||||
case it refers to the start or end of the array).
|
||||
Indices are zero-based.
|
||||
|
||||
examples:
|
||||
- program: '.[2:4]'
|
||||
@@ -422,7 +423,8 @@ sections:
|
||||
entirely, it will return *all* of the elements of an
|
||||
array. Running `.[]` with the input `[1,2,3]` will produce the
|
||||
numbers as three separate results, rather than as a single
|
||||
array.
|
||||
array. A filter of the form `.foo[]` is equivalent to
|
||||
`.foo | .[]`.
|
||||
|
||||
You can also use this on an object, and it will return all
|
||||
the values of the object.
|
||||
@@ -438,6 +440,10 @@ sections:
|
||||
input: '[]'
|
||||
output: []
|
||||
|
||||
- program: '.foo[]'
|
||||
input: '{"foo":[1,2,3]}'
|
||||
output: ['1','2','3']
|
||||
|
||||
- program: '.[]'
|
||||
input: '{"a": 1, "b": 1}'
|
||||
output: ['1', '1']
|
||||
@@ -446,7 +452,8 @@ sections:
|
||||
body: |
|
||||
|
||||
Like `.[]`, but no errors will be output if . is not an array
|
||||
or object.
|
||||
or object. A filter of the form `.foo[]?` is equivalent to
|
||||
`.foo | .[]?`.
|
||||
|
||||
- title: "Comma: `,`"
|
||||
body: |
|
||||
@@ -516,7 +523,7 @@ sections:
|
||||
hashes with only string keys), and "null".
|
||||
|
||||
Booleans, null, strings and numbers are written the same way as
|
||||
in javascript. Just like everything else in jq, these simple
|
||||
in JSON. Just like everything else in jq, these simple
|
||||
values take an input and produce an output - `42` is a valid jq
|
||||
expression that takes an input, ignores it, and returns 42
|
||||
instead.
|
||||
@@ -618,15 +625,15 @@ sections:
|
||||
Recursively descends `.`, producing every value. This is the
|
||||
same as the zero-argument `recurse` builtin (see below). This
|
||||
is intended to resemble the XPath `//` operator. Note that
|
||||
`..a` does not work; use `..|.a` instead. In the example
|
||||
below we use `..|.a?` to find all the values of object keys
|
||||
`..a` does not work; use `.. | .a` instead. In the example
|
||||
below we use `.. | .a?` to find all the values of object keys
|
||||
"a" in any object found "below" `.`.
|
||||
|
||||
This is particularly useful in conjunction with `path(EXP)`
|
||||
(also see below) and the `?` operator.
|
||||
|
||||
examples:
|
||||
- program: '..|.a?'
|
||||
- program: '.. | .a?'
|
||||
input: '[[{"a":1}]]'
|
||||
output: ['1']
|
||||
|
||||
@@ -1008,12 +1015,25 @@ sections:
|
||||
input: 'null'
|
||||
output: ['[1,2,3]']
|
||||
|
||||
- title: "`error(message)`"
|
||||
- title: "`error`, `error(message)`"
|
||||
body: |
|
||||
|
||||
Produces an error, just like `.a` applied to values other than
|
||||
null and objects would, but with the given message as the
|
||||
error's value. Errors can be caught with try/catch; see below.
|
||||
Produces an error with the input value, or with the message
|
||||
given as the argument. Errors can be caught with try/catch;
|
||||
see below.
|
||||
|
||||
When the error value is `null`, it produces nothing and works
|
||||
just like `empty`. So `[null | error]` and `[error(null)]` both
|
||||
emit `[]`.
|
||||
|
||||
examples:
|
||||
- program: 'try error catch .'
|
||||
input: '"error message"'
|
||||
output: ['"error message"']
|
||||
|
||||
- program: 'try error("invalid value: \(.)") catch .'
|
||||
input: '42'
|
||||
output: ['"invalid value: 42"']
|
||||
|
||||
- title: "`halt`"
|
||||
body: |
|
||||
@@ -1302,19 +1322,25 @@ sections:
|
||||
sorted order), and if their keys are equal then the values
|
||||
are compared key by key.
|
||||
|
||||
`sort` may be used to sort by a particular field of an
|
||||
object, or by applying any jq filter.
|
||||
|
||||
`sort_by(f)` compares two elements by comparing the result of
|
||||
`f` on each element.
|
||||
`sort_by` may be used to sort by a particular field of an
|
||||
object, or by applying any jq filter. `sort_by(f)` compares
|
||||
two elements by comparing the result of `f` on each element.
|
||||
When `f` produces multiple values, it firstly compares the
|
||||
first values, and the second values if the first values are
|
||||
equal, and so on.
|
||||
|
||||
examples:
|
||||
- program: 'sort'
|
||||
input: '[8,3,null,6]'
|
||||
output: ['[null,3,6,8]']
|
||||
|
||||
- program: 'sort_by(.foo)'
|
||||
input: '[{"foo":4, "bar":10}, {"foo":3, "bar":100}, {"foo":2, "bar":1}]'
|
||||
output: ['[{"foo":2, "bar":1}, {"foo":3, "bar":100}, {"foo":4, "bar":10}]']
|
||||
input: '[{"foo":4, "bar":10}, {"foo":3, "bar":10}, {"foo":2, "bar":1}]'
|
||||
output: ['[{"foo":2, "bar":1}, {"foo":3, "bar":10}, {"foo":4, "bar":10}]']
|
||||
|
||||
- program: 'sort_by(.foo, .bar)'
|
||||
input: '[{"foo":4, "bar":10}, {"foo":3, "bar":20}, {"foo":2, "bar":1}, {"foo":3, "bar":10}]'
|
||||
output: ['[{"foo":2, "bar":1}, {"foo":3, "bar":10}, {"foo":3, "bar":20}, {"foo":4, "bar":10}]']
|
||||
|
||||
- title: "`group_by(path_expression)`"
|
||||
body: |
|
||||
@@ -1441,9 +1467,21 @@ sections:
|
||||
- program: 'index(", ")'
|
||||
input: '"a,b, cd, efg, hijk"'
|
||||
output: ['3']
|
||||
- program: 'index(1)'
|
||||
input: '[0,1,2,1,3,1,4]'
|
||||
output: ['1']
|
||||
- program: 'index([1,2])'
|
||||
input: '[0,1,2,3,1,4,2,5,1,2,6,7]'
|
||||
output: ['1']
|
||||
- program: 'rindex(", ")'
|
||||
input: '"a,b, cd, efg, hijk"'
|
||||
output: ['12']
|
||||
- program: 'rindex(1)'
|
||||
input: '[0,1,2,1,3,1,4]'
|
||||
output: ['5']
|
||||
- program: 'rindex([1,2])'
|
||||
input: '[0,1,2,3,1,4,2,5,1,2,6,7]'
|
||||
output: ['8']
|
||||
|
||||
- title: "`inside`"
|
||||
body: |
|
||||
@@ -1648,7 +1686,7 @@ sections:
|
||||
When called without an argument, `recurse` is equivalent to
|
||||
`recurse(.[]?)`.
|
||||
|
||||
`recurse(f)` is identical to `recurse(f; . != null)` and can be
|
||||
`recurse(f)` is identical to `recurse(f; true)` and can be
|
||||
used without concerns about recursion depth.
|
||||
|
||||
`recurse(f; condition)` is a generator which begins by
|
||||
@@ -2634,29 +2672,6 @@ sections:
|
||||
$times_three | [. + $times_three]) | ...`: here the binding
|
||||
`$times_three` is _not_ visible past the closing parenthesis.
|
||||
|
||||
- title: Reduce
|
||||
body: |
|
||||
|
||||
The `reduce` syntax in jq allows you to combine all of the
|
||||
results of an expression by accumulating them into a single
|
||||
answer. As an example, we'll pass `[3,2,1]` to this expression:
|
||||
|
||||
reduce .[] as $item (0; . + $item)
|
||||
|
||||
For each result that `.[]` produces, `. + $item` is run to
|
||||
accumulate a running total, starting from 0. In this
|
||||
example, `.[]` produces the results 3, 2, and 1, so the
|
||||
effect is similar to running something like this:
|
||||
|
||||
0 | (3 as $item | . + $item) |
|
||||
(2 as $item | . + $item) |
|
||||
(1 as $item | . + $item)
|
||||
|
||||
examples:
|
||||
- program: 'reduce .[] as $item (0; . + $item)'
|
||||
input: '[10,2,5,3]'
|
||||
output: ['20']
|
||||
|
||||
- title: "`isempty(exp)`"
|
||||
body: |
|
||||
|
||||
@@ -2667,6 +2682,14 @@ sections:
|
||||
input: 'null'
|
||||
output: ['true']
|
||||
|
||||
- program: 'isempty(.[])'
|
||||
input: '[]'
|
||||
output: ['true']
|
||||
|
||||
- program: 'isempty(.[])'
|
||||
input: '[1,2,3]'
|
||||
output: ['false']
|
||||
|
||||
- title: "`limit(n; exp)`"
|
||||
body: |
|
||||
|
||||
@@ -2706,32 +2729,79 @@ sections:
|
||||
input: '10'
|
||||
output: ['[0,9,5]']
|
||||
|
||||
- title: "`reduce`"
|
||||
body: |
|
||||
|
||||
The `reduce` syntax allows you to combine all of the results of
|
||||
an expression by accumulating them into a single answer.
|
||||
The form is `reduce EXP as $var (INIT; UPDATE)`.
|
||||
As an example, we'll pass `[1,2,3]` to this expression:
|
||||
|
||||
reduce .[] as $item (0; . + $item)
|
||||
|
||||
For each result that `.[]` produces, `. + $item` is run to
|
||||
accumulate a running total, starting from 0 as the input value.
|
||||
In this example, `.[]` produces the results `1`, `2`, and `3`,
|
||||
so the effect is similar to running something like this:
|
||||
|
||||
0 | 1 as $item | . + $item |
|
||||
2 as $item | . + $item |
|
||||
3 as $item | . + $item
|
||||
|
||||
examples:
|
||||
- program: 'reduce .[] as $item (0; . + $item)'
|
||||
input: '[1,2,3,4,5]'
|
||||
output: ['15']
|
||||
|
||||
- program: 'reduce .[] as [$i,$j] (0; . + $i * $j)'
|
||||
input: '[[1,2],[3,4],[5,6]]'
|
||||
output: ['44']
|
||||
|
||||
- program: 'reduce .[] as {$x,$y} (null; .x += $x | .y += [$y])'
|
||||
input: '[{"x":"a","y":1},{"x":"b","y":2},{"x":"c","y":3}]'
|
||||
output: ['{"x":"abc","y":[1,2,3]}']
|
||||
|
||||
- title: "`foreach`"
|
||||
body: |
|
||||
|
||||
The `foreach` syntax is similar to `reduce`, but intended to
|
||||
allow the construction of `limit` and reducers that produce
|
||||
intermediate results (see example).
|
||||
intermediate results.
|
||||
|
||||
The form is `foreach EXP as $var (INIT; UPDATE; EXTRACT)`.
|
||||
Like `reduce`, `INIT` is evaluated once to produce a state
|
||||
value, then each output of `EXP` is bound to `$var`, `UPDATE`
|
||||
is evaluated for each output of `EXP` with the current state
|
||||
and with `$var` visible. Each value output by `UPDATE`
|
||||
replaces the previous state. Finally, `EXTRACT` is evaluated
|
||||
for each new state to extract an output of `foreach`.
|
||||
As an example, we'll pass `[1,2,3]` to this expression:
|
||||
|
||||
This is mostly useful only for constructing `reduce`- and
|
||||
`limit`-like functions. But it is much more general, as it
|
||||
allows for partial reductions (see the example below).
|
||||
foreach .[] as $item (0; . + $item; [$item, . * 2])
|
||||
|
||||
Like the `reduce` syntax, `. + $item` is run for each result
|
||||
that `.[]` produces, but `[$item, . * 2]` is run for each
|
||||
intermediate values. In this example, since the intermediate
|
||||
values are `1`, `3`, and `6`, the `foreach` expression produces
|
||||
`[1,2]`, `[2,6]`, and `[3,12]`. So the effect is similar
|
||||
to running something like this:
|
||||
|
||||
0 | 1 as $item | . + $item | [$item, . * 2],
|
||||
2 as $item | . + $item | [$item, . * 2],
|
||||
3 as $item | . + $item | [$item, . * 2]
|
||||
|
||||
When `EXTRACT` is omitted, the identity filter is used.
|
||||
That is, it outputs the intermediate values as they are.
|
||||
|
||||
examples:
|
||||
- program: '[foreach .[] as $item
|
||||
([[],[]];
|
||||
if $item == null then [[],.[0]] else [(.[0] + [$item]),[]] end;
|
||||
if $item == null then .[1] else empty end)]'
|
||||
input: '[1,2,3,4,null,"a","b",null]'
|
||||
output: ['[[1,2,3,4],["a","b"]]']
|
||||
- program: 'foreach .[] as $item (0; . + $item)'
|
||||
input: '[1,2,3,4,5]'
|
||||
output: ['1','3','6','10','15']
|
||||
|
||||
- program: 'foreach .[] as $item (0; . + $item; [$item, . * 2])'
|
||||
input: '[1,2,3,4,5]'
|
||||
output: ['[1,2]','[2,6]','[3,12]','[4,20]','[5,30]']
|
||||
|
||||
- program: 'foreach .[] as $item (0; . + 1; {index: ., $item})'
|
||||
input: '["foo", "bar", "baz"]'
|
||||
output:
|
||||
- '{"index":1,"item":"foo"}'
|
||||
- '{"index":2,"item":"bar"}'
|
||||
- '{"index":3,"item":"baz"}'
|
||||
|
||||
- title: Recursion
|
||||
body: |
|
||||
@@ -2870,6 +2940,8 @@ sections:
|
||||
|
||||
Outputs one new input.
|
||||
|
||||
echo 1 2 3 4 | jq '[., input]' # [1,2] [3,4]
|
||||
|
||||
- title: "`inputs`"
|
||||
body: |
|
||||
|
||||
@@ -2878,6 +2950,8 @@ sections:
|
||||
This is primarily useful for reductions over a program's
|
||||
inputs.
|
||||
|
||||
echo 1 2 3 | jq -n 'reduce inputs as $i (0; . + $i)' # 6
|
||||
|
||||
- title: "`debug`"
|
||||
body: |
|
||||
|
||||
@@ -2936,9 +3010,9 @@ sections:
|
||||
given streaming expression.
|
||||
|
||||
examples:
|
||||
- program: '[1|truncate_stream([[0],1],[[1,0],2],[[1,0]],[[1]])]'
|
||||
- program: 'truncate_stream([[0],1],[[1,0],2],[[1,0]],[[1]])'
|
||||
input: '1'
|
||||
output: ['[[[0],2],[[0]]]']
|
||||
output: ['[[0],2]', '[[0]]']
|
||||
|
||||
- title: "`fromstream(stream_expression)`"
|
||||
body: |
|
||||
|
||||
Reference in new issue
Block a user