使用jq获取json中字符串出现的总次数

时间:2017-10-19 21:44:36

标签: json count jq

我想使用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 ..当我尝试添加“|长度”时,对我来说不起作用。它给出了错误的计数

2 个答案:

答案 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,并提供一个最简单的示例,说明您遇到的问题。

计数/ 1

更有效,也许更好的方法是使用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)