我想使用jq计算此json字符串中“1.2.3.46:8983_emo”的出现次数。
1.2.3.46:8983_emo出现在myApp& myApp_shadow。所以计数将是2
使用以下jq过滤器
.cluster.collections.myApp.shards.shard1.replicas[].node_name
我能够获得node_names,但我需要这样的东西,这是行不通的。我不知道如何看待'myApp'和& 'myApp_shadow'。你能帮忙吗
.cluster.collections | select (.myApp.shards.shard1.replicas[].node_name=="1.2.3.46:8983_emo")
以下是摘录... https://jqplay.org/s/VvdATQ6bAr
FYI ..当我尝试添加“|长度”时,对我来说不起作用。它给出了错误的计数
答案 0 :(得分:0)
对问题的描述非常混乱。例如,在给定的JSON中实际上有三次出现JSON字符串“1.2.3.46:8983_emo”:
.. | strings | select(. == "1.2.3.46:8983_emo")
显示有三次出现。
如果您只想查看.myApp和.myApp_shadow,请考虑:
.cluster.collections
| [(.myApp, .myApp_shadow) | .. | strings | select(.=="1.2.3.46:8983_emo")]
| length
这会产生你所期望的答案(即2)。
希望以上内容能为您提供足够的指导,让您做任何您想做的事情;如果没有,请参阅http://stackoverflow.com/help/mcve,并提供一个最简单的示例,说明您遇到的问题。
更有效,也许更好的方法是使用count/1
:
def count(s): reduce s as $x (0; .+1);
这将计算流中的项目数s,而不构造数组。所以你可以写一下:
.cluster.collections
| "1.2.3.46:8983_emo" as $s
| count((.myApp, .myApp_shadow) | .. | strings | select(.==$s))
或者,如果您只想检查“node_name”键的值:
count(.. | select(.node_name? == "1.2.3.46:8983_emo"))
答案 1 :(得分:0)
这是另一个使用tostream
的解决方案reduce (
tostream
| select(length==2) as [$p,$v]
| select($p[-1]=="node_name" and $v=="1.2.3.46:8983_emo")
) as $n (0;.+1)