使用JQ对多个JSON字段执行相同的操作

时间:2018-08-10 13:27:56

标签: json functional-programming jq

我正在尝试使用JQ更改JSON对象中多个字段的值。但是,我想对每个字段执行相同的操作。我做到了,但是我的做法似乎多余。

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

是否有一种方法可以做到这一点:(不完全是这样,因为JQ不会那样工作)

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

1 个答案:

答案 0 :(得分:2)

由于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)

triple / 1

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

triple(.fieldOne, .fieldTwo)