JQ - как | = оператор работает? - PullRequest
2 голосов
/ 10 марта 2020

В JQ Manual имеется фильтр-назначение: | = и его пример.

jq '(..|select(type=="boolean")) |= if . then 1 else 0 end'
Input   [true,false,[5,true,[true,[false]],false]]
Output  [1,0,[5,1,[1,[0]],0]]

Почему это не приводит к JSON поток ниже, но поддерживает исходный формат вложенного списка?

1
0
1
1
0
0

Для меня (.. | select (type == "boolean")) производит:

true
false
true
true
false
false

Затем применяется | = if. тогда 1 иначе 0 end не выдаст это?

1
0
1
1
0
0

Пожалуйста, помогите понять, как ** | = ** операция поддерживает, может поддерживать формат ввода.

Ответы [ 2 ]

1 голос
/ 10 марта 2020

В правой части |=, . не относится к каждому логическому значению, выведенному с левой стороны. Он относится к пути от до каждого значения, полученного с левой стороны.

Фильтр (..|select(type=="boolean")) |= if . then 1 else 0 end с учетом вашего ввода эквивалентен

.[0] |= if . then 1 else 0 end | 
.[1] |= if . then 1 else 0 end |
.[2][0] |= if . then 1 else 0 end | ...
0 голосов
/ 11 марта 2020

Любое назначение, будь то через =, |= или любое другое, не изменяет контекст в результате назначения. Он просто обновляет выбранное значение и передает исходный . ввод. И, как указывает Чепнер, расширенное выражение - это просто последовательность назначений, ни одно из которых не меняет контекст.

Если вы хотите получить только сопоставленные значения, вам не нужно выполнять назначение вот и просто делай обычную трубу.

.. | select(type=="boolean") | if . then 1 else 0 end
...