Выполните ту же операцию с несколькими полями json с помощью jq

Я пытаюсь изменить значения нескольких полей в объекте JSON с помощью JQ. Однако я хочу выполнить одну и ту же операцию с каждым из этих полей. Я добился этого, но то, как я это сделал, кажется излишним.

jq '.fieldOne |= . * 3 | .fieldTwo |= . * 3 | ...'

Есть ли способ сделать что-то вроде этого: (не совсем так, потому что JQ не будет так работать)

jq '(.fieldOne | .fieldTwo | ...) |= . * 3'

2
0
123
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Благодаря магии jq вы могли просто написать:

(.fieldOne, .fieldTwo) |= .*3

В более общем смысле, вот два других подхода.

multiop / 2

# 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)

тройной / 1

def triple(f): f |= . * 3;

triple(.fieldOne, .fieldTwo)

Ах, умно, я все еще пытаюсь найти способ с чистым JQ, но это полезно, спасибо

Isaac Abramowitz 10.08.2018 16:37

Спасибо! Первая строка делает именно то, что я хочу. Я знал, что мне не хватает синтаксиса.

Isaac Abramowitz 10.08.2018 16:40

Другие вопросы по теме