使用 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"
}
]
由于.Status
和.Count
是字符串,不是数字,所以需要用tonumber
和tostring
来回转换。您可能想要,特别是如果您有更多的计算要处理,首先将它们转换为数字,然后进行所有(现在更简单的)处理,最后将它们转换回来(如果需要)。
jq '
map((.Status, .Count) |= tonumber)
| group_by([(.Status > 1), .Action])
| map(.[0].Count = (map(.Count) | add) | .[0])
| map((.Status, .Count) |= tostring)
'
想解决问题,却又不知如何下手。 我有 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"
}
]
由于.Status
和.Count
是字符串,不是数字,所以需要用tonumber
和tostring
来回转换。您可能想要,特别是如果您有更多的计算要处理,首先将它们转换为数字,然后进行所有(现在更简单的)处理,最后将它们转换回来(如果需要)。
jq '
map((.Status, .Count) |= tonumber)
| group_by([(.Status > 1), .Action])
| map(.[0].Count = (map(.Count) | add) | .[0])
| map((.Status, .Count) |= tostring)
'