我尝试使用jq将Solr 6.5指标解析为键值对:
{
"responseHeader": {
"status": 0,
"QTime": 7962
},
"metrics": [
"solr.core.shard1",
"QUERY./select",
"solr.core.shard2",
"QUERY./update"
...
]
}
我想在metrics数组中挑选奇数条目,并将它们组合成一个对象作为键值对,如下所示:
{
"solr.core.shard1": "QUERY./select",
"solr.core.shard2": "QUERY./update",
...
}
直到现在,我才能想出:
.metrics | to_entries | .[] | {(select(.key % 2 == 0).value): select(.key % 2 == 1).value}
但这会返回错误或没有结果。
如果有人能指出我正确的方向,我将不胜感激。我觉得答案可能就在地图操作员身上,但我还没能弄明白。
答案 0 :(得分:2)
jq
解决方案:
jq '[ .metrics as $m | range(0; $m | length; 2)
| {($m[.]): $m[(. + 1)]} ] | add' jsonfile
输出:
{
"solr.core.shard1": "QUERY./select",
"solr.core.shard2": "QUERY./update"
}
https://stedolan.github.io/jq/manual/v1.5/#range(upto),range(from;upto)range(from;upto;by)
答案 1 :(得分:1)
这是一个辅助功能,使解决方案变得微不足道:
# Emit a stream consisting of pairs of items taken from `stream`
def pairwise(stream):
foreach stream as $i ([];
if length == 1 then . + [$i] else [$i] end;
select(length == 2));
从这里有几个不错的选择,例如我们可以从:
开始.metrics
| [pairwise(.[]) | {(.[0]): .[1]}]
| add
根据您的输入,这会产生:
{
"solr.core.shard1": "QUERY./select",
"solr.core.shard2": "QUERY./update"
}
所以你可能想写:
.metrics |= ([pairwise(.[]) | {(.[0]): .[1]}] | add)