使用 JQ 将 json 中的对象替换为其总和

Replace objects in json with their sum using JQ

想解决问题,却又不知如何下手。 我有 json 这样的

[
  {
    "Count": "226",
    "Action": "1",
    "Status": "1",
    "Client": "26"
  },
  {
    "Count": "224",
    "Action": "1",
    "Status": "2",
    "Client": "26"
  },
  {
    "Count": "3",
    "Action": "1",
    "Status": "6",
    "Client": "26"
  },
  {
    "Count": "233",
    "Action": "2",
    "Status": "1",
    "Client": "26"
  },
  {
    "Count": "7",
    "Action": "2",
    "Status": "2",
    "Client": "26"
  }
]

而且我需要获取 Status > 1 的不同 Action 的计数器总和。结果应替换汇总元素。 结果示例:

[
  {
    "Count": "226",
    "Action": "1",
    "Status": "1",
    "Client": "26"
  },
  {
    "Count": "227",
    "Action": "1",
    "Status": "2",
    "Client": "26"
  },
  {
    "Count": "233",
    "Action": "2",
    "Status": "1",
    "Client": "26"
  },
  {
    "Count": "7",
    "Action": "2",
    "Status": "2",
    "Client": "26"
  }
]

如您所见,“Action”:“1”和“Status”:“2”的元素中的字段 Count 在“Action”:“1”和“Status”:“的对象的值上增加了6

我不知道该怎么做。如有任何帮助或建议,我们将不胜感激。

此解决方案聚合到每个重复列表中的第一个项目(这在您的示例数据中并不明显,请参阅 )。

group_by 将要聚合的项目分组,由 .Status 更大的 1.Action 的内容决定。然后,map 每个分组列表的第一个 (.[0]) 项目的 .Count 字段是通过 add 计算所有 .Count 字段的值来计算的。每个组内的输出是第一个 (.[0]) 个元素。

jq '
  group_by([(.Status | tonumber > 1), .Action])
  | map(.[0].Count = (map(.Count | tonumber) | add | tostring) | .[0])
'
[
  {
    "Count": "226",
    "Action": "1",
    "Status": "1",
    "Client": "26"
  },
  {
    "Count": "233",
    "Action": "2",
    "Status": "1",
    "Client": "26"
  },
  {
    "Count": "227",
    "Action": "1",
    "Status": "2",
    "Client": "26"
  },
  {
    "Count": "7",
    "Action": "2",
    "Status": "2",
    "Client": "26"
  }
]

Demo

由于.Status.Count是字符串,不是数字,所以需要用tonumbertostring来回转换。您可能想要,特别是如果您有更多的计算要处理,首先将它们转换为数字,然后进行所有(现在更简单的)处理,最后将它们转换回来(如果需要)。

jq '
  map((.Status, .Count) |= tonumber)
  | group_by([(.Status > 1), .Action])
  | map(.[0].Count = (map(.Count) | add) | .[0])
  | map((.Status, .Count) |= tostring)
'

Demo