jq 在嵌套数组中添加一个键的值并赋予一个新键
jq add value of a key in nested array and given to a new key
我有一个像这样的 JSON 数组流
[{"id":"AQ","Count":0}]
[{"id":"AR","Count":1},{"id":"AR","Count":3},{"id":"AR","Count":13},
{"id":"AR","Count":12},{"id":"AR","Count":5}]
[{"id":"AS","Count":0}]
我想用 jq 得到一个新的 json 像这样
{"id":"AQ","Count":0}
{"id":"AR","Count":34}
{"id":"AS","Count":0}
34=1+3+13+12+5 在第二个数组中。
我不知道如何详细描述它。但我的示例中显示了基本思想。
我使用 bash 并且更喜欢使用 jq 来解决这个问题。谢谢!
有点乱,但考虑到您的意见:
jq -c '
reduce .[] as $item ({}; .[($item.id)] += ($item.Count))
| to_entries
| .[] | {"id": .key, "Count": .value}
'
产生输出:
{"id":"AQ","Count":0}
{"id":"AR","Count":34}
{"id":"AS","Count":0}
假设每个数组中的 .id 相同:
first + {Count: map(.Count) | add}
或者更容易理解:
(map(.Count) | add) as $sum | first | .Count = $sum
或者更明确地说:
{ id: (first|.id), Count: (map(.Count) | add) }
如果您想要一个不假设每个输入数组具有相同 ID 的高效但通用的解决方案,那么以下辅助函数可以使解决方案变得简单:
# Input: a JSON object representing the subtotals
# Output: the object augmented with additional subtotals
def adder(stream; id; filter):
reduce stream as $s (.; .[$s|id] += ($s|filter));
假设你的 jq 有 inputs
,那么最有效的方法是使用它(但记得使用 -n 命令行选项):
reduce inputs as $row ({}; adder($row[]; .id; .Count) )
这会产生:
{"AQ":0,"AR":34,"AS":0}
从这里,很容易得到你想要的答案,例如使用 to_entries[] | {(.key): .value}
如果您的 jq 没有 inputs
并且您不想升级,则使用 -s 选项(而不是 -n)并将 inputs
替换为 .[]
我有一个像这样的 JSON 数组流
[{"id":"AQ","Count":0}]
[{"id":"AR","Count":1},{"id":"AR","Count":3},{"id":"AR","Count":13},
{"id":"AR","Count":12},{"id":"AR","Count":5}]
[{"id":"AS","Count":0}]
我想用 jq 得到一个新的 json 像这样
{"id":"AQ","Count":0}
{"id":"AR","Count":34}
{"id":"AS","Count":0}
34=1+3+13+12+5 在第二个数组中。 我不知道如何详细描述它。但我的示例中显示了基本思想。 我使用 bash 并且更喜欢使用 jq 来解决这个问题。谢谢!
有点乱,但考虑到您的意见:
jq -c '
reduce .[] as $item ({}; .[($item.id)] += ($item.Count))
| to_entries
| .[] | {"id": .key, "Count": .value}
'
产生输出:
{"id":"AQ","Count":0}
{"id":"AR","Count":34}
{"id":"AS","Count":0}
假设每个数组中的 .id 相同:
first + {Count: map(.Count) | add}
或者更容易理解:
(map(.Count) | add) as $sum | first | .Count = $sum
或者更明确地说:
{ id: (first|.id), Count: (map(.Count) | add) }
如果您想要一个不假设每个输入数组具有相同 ID 的高效但通用的解决方案,那么以下辅助函数可以使解决方案变得简单:
# Input: a JSON object representing the subtotals
# Output: the object augmented with additional subtotals
def adder(stream; id; filter):
reduce stream as $s (.; .[$s|id] += ($s|filter));
假设你的 jq 有 inputs
,那么最有效的方法是使用它(但记得使用 -n 命令行选项):
reduce inputs as $row ({}; adder($row[]; .id; .Count) )
这会产生:
{"AQ":0,"AR":34,"AS":0}
从这里,很容易得到你想要的答案,例如使用 to_entries[] | {(.key): .value}
如果您的 jq 没有 inputs
并且您不想升级,则使用 -s 选项(而不是 -n)并将 inputs
替换为 .[]