Я пытаюсь изменить значения нескольких полей в объекте JSON с помощью JQ. Однако я хочу выполнить одну и ту же операцию с каждым из этих полей. Я добился этого, но то, как я это сделал, кажется излишним.
jq '.fieldOne |= . * 3 | .fieldTwo |= . * 3 | ...'
Есть ли способ сделать что-то вроде этого: (не совсем так, потому что JQ не будет так работать)
jq '(.fieldOne | .fieldTwo | ...) |= . * 3'
Благодаря магии jq вы могли просто написать:
(.fieldOne, .fieldTwo) |= .*3
В более общем смысле, вот два других подхода.
# If the input is an object, $fields should be an array of key names
# If the input is an array, $fields should be an array of integers
def multiop($fields; f):
if $fields|length == 0 then .
else .[$fields[0]] |= f
| multiop($fields[1:]; f)
end;
multiop(["fieldOne", "fieldTwo"]; . * 3)
Или, если вы хотите, чтобы операция применялась ко всем полям:
multiop( keys_unsorted; .*3)
def triple(f): f |= . * 3;
triple(.fieldOne, .fieldTwo)
Спасибо! Первая строка делает именно то, что я хочу. Я знал, что мне не хватает синтаксиса.
Ах, умно, я все еще пытаюсь найти способ с чистым JQ, но это полезно, спасибо