JQ的多语句:累加多个字段

Multiple statements with JQ: Cumulate multiple fields

这是我在这个例子中的数据:

[
  {
    "date": "25-09-20",
    "nbrMembers": 1,
    "nbrWallets": 4
  },
  {
    "date": "26-09-20",
    "nbrMembers": 3,
    "nbrWallets": 1
  },
  {
    "date": "27-09-20",
    "nbrMembers": 0,
    "nbrWallets": 2
  },
  {
    "date": "28-09-20",
    "nbrMembers": 7,
    "nbrWallets": 3
  }
]

我需要用累积字段转换 json。 这是预期的结果:

[
  {
    "date": "25-09-20",
    "nbrMembers": 1,
    "nbrWallets": 4
  },
  {
    "date": "26-09-20",
    "nbrMembers": 4,
    "nbrWallets": 5
  },
  {
    "date": "27-09-20",
    "nbrMembers": 4,
    "nbrWallets": 7
  },
  {
    "date": "28-09-20",
    "nbrMembers": 11,
    "nbrWallets": 10
  }
]

这就是我正在做的,只累积一个字段:

jq 'foreach .[] as $row (0; . + $row.nbrMembers ; . as $x | $row | (.nbrMembers = $x))' test.json

我只是不知道如何处理多个字段?

您可以使用整个对象而不只是一个字段作为 foreach 中的当前元素。

jq '[foreach .[] as $row ({nbrMembers: 0, nbrWallets: 0}; {nbrMembers: ($row.nbrMembers + .nbrMembers), nbrWallets:  ($row.nbrWallets + .nbrWallets)  }; . as $x | $row | .nbrMembers = $x.nbrMembers | .nbrWallets = $x.nbrWallets) ]' test.json

这是一个更短的版本。我们可以用$row * .合并结果)


jq '[foreach .[] as $row (
      {nbrMembers: 0, nbrWallets: 0};
      { 
        nbrMembers: ($row.nbrMembers + .nbrMembers), 
        nbrWallets: ($row.nbrWallets + .nbrWallets)
      }; 
     $row * .  
    )]' test.json

简明扼要:

jq '[ foreach .[] as $row (null;
          .nbrMembers += $row.nbrMembers
        | .nbrWallets += $row.nbrWallets;
        $row + . ) ]
' test.json