jq from_entries 的变体,它整理每个键出现的值
variant of jq from_entries that collate values for each key occurrence
我可以将 jq 用于 运行 一个过滤器,其行为类似于 from_entries,唯一的区别是,如果遇到同一键的多个条目,它将把这些值整理成一个数组,而不是只使用最后一个值?
如果是这样,什么过滤器可以实现这一点?例如,如果我的输入是:
[
{
"key": "a",
"value": 1
},
{
"key": "b",
"value": 2
},
{
"key": "a",
"value": 3
},
{
"key": "b",
"value": 4
}
]
那么所需的输出将是:
{ "a": [1,3], "b": [2,4] }
请注意,单独使用 'from_entries' 作为过滤器,结果值只是最后一个值(即 { "a": 3, "b": 4 }
)
使用您的示例和 merge.jq 中的以下行:
def merge_entries:
reduce .[] as $pair ({}; .[$pair["key"]] += [$pair["value"]] );
merge_entries
调用:jq -c -f merge.jq
产量:
{"a":[1,3],"b":[2,4]}
您也可以使用调用:
jq 'reduce .[] as $p ({}; .[$p.key] += [$p.value])'
我可以将 jq 用于 运行 一个过滤器,其行为类似于 from_entries,唯一的区别是,如果遇到同一键的多个条目,它将把这些值整理成一个数组,而不是只使用最后一个值?
如果是这样,什么过滤器可以实现这一点?例如,如果我的输入是:
[
{
"key": "a",
"value": 1
},
{
"key": "b",
"value": 2
},
{
"key": "a",
"value": 3
},
{
"key": "b",
"value": 4
}
]
那么所需的输出将是:
{ "a": [1,3], "b": [2,4] }
请注意,单独使用 'from_entries' 作为过滤器,结果值只是最后一个值(即 { "a": 3, "b": 4 }
)
使用您的示例和 merge.jq 中的以下行:
def merge_entries:
reduce .[] as $pair ({}; .[$pair["key"]] += [$pair["value"]] );
merge_entries
调用:jq -c -f merge.jq 产量:
{"a":[1,3],"b":[2,4]}
您也可以使用调用:
jq 'reduce .[] as $p ({}; .[$p.key] += [$p.value])'