Во-первых, вот вариант первого решения @ OguzIsmail для первой проблемы. Он служит для проверки полезности универсальной функции:
def sigma(s): reduce s as $x (0; .+$x);
При этом и с использованием параметра командной строки -n решение данной проблемы просто:
sigma(inputs.game.player1.score)
Вторая проблема
В том же духе универсальности:
def sigmas(stream; f):
reduce stream as $s (null;
[., ($s | f)] | transpose | map(add));
sigmas(inputs | .game; [.player1.score, .player2.score])
| {player1: .[0], player2: .[1]}
Обратите внимание, что sigmas
, как определено здесь, может обрабатывать произвольно много слагаемых. Еще более универсальное решение, исключающее необходимость указывать слагаемые в виде списка, оставлено читателю в качестве (простого) упражнения: -)
jq.jq
Как правило, универсальные функцииможет быть включен в «стандартную библиотеку JQ». Например, если ваши служебные функции находятся в ~ / .jq / jq.jq, то, предполагая, что pwd не имеет другого jq.jq, вы можете написать (для решения первой проблемы):
jq -n 'include "jq"; sigma(inputs.game.player1.score)' foo.json
Надежное включение библиотеки
Чтобы избежать трудностей, связанных с путями модулей, иногда имеет смысл указывать путь в директиве include
или import
, например:
jq -n 'include "jq" {search: "~/jq"}; ...'