Arrays JQ:计数字符串出现的次数

Arrays JQ:计数字符串出现的次数,arrays,bash,command-line,count,jq,Arrays,Bash,Command Line,Count,Jq,使用以下代码,我得到了很长的JSON的以下输出: map({Animal: .[].payload.animal}) | map(select(.Animal))[][] 从这个输出中,我如何构建/添加我的JQ命令以获得结果2(狗的出现总数)。我已经尝试使用add和select语句的组合(几个小时了!)来获得所需的输出,但一直未能实现。非常感谢您的帮助 应要求: 样本输入: [ [ "Dog", "Cat" ] ] [ [ "Dog", "Ca

使用以下代码,我得到了很长的JSON的以下输出:

map({Animal: .[].payload.animal})
|   map(select(.Animal))[][]
从这个输出中,我如何构建/添加我的JQ命令以获得结果2(狗的出现总数)。我已经尝试使用add和select语句的组合(几个小时了!)来获得所需的输出,但一直未能实现。非常感谢您的帮助


应要求:

样本输入:

[
  [
    "Dog",
    "Cat"
  ]
]
[
  [
    "Dog",
    "Cat",
    "Bird"
  ]
]
样本输出:2(计算狗的数量)


我希望仅当“Dog”出现在“Pets”数据字段/键中时,才对其进行计数。主查询结果中的最后一个尾随
[]
在一个流中,这不适合使用
长度进行计数。为简单起见,您可以选择:

[{
    "Data": {
        "IsInUS": 1,
        "Pets": [
            ["Dog", "Cat", "Bird"]
        ],
        "Favorite Pet": "Dog"
    },
    "UniqueID": "1234"
},
{
    "Data": {
        "IsInUS": 1,
        "Pets": [
            ["Dog", "Cat", "Bird"]
        ]
        "Favorite Pet": "Cat"
    },
    "UniqueID": "234"
}]
计算流中的项目 更有效的计数方法是对流中的项目进行计数:

[.. | strings | select(. == "Dog")] | length
“狗”只在宠物中出现
请在您的问题中添加示例输入和该示例输入所需的输出。我已更新了问题,感谢您的注释和帮助!我猜您的示例不是有效的JSON代码。嗨,cyus,我相信它是有效的JSON(有一个额外的逗号,所以我刚刚添加了它),请修复“示例输入”,使其成为有效的JSON。您可能希望使用
jq empty
进行验证,或者使用jsonlint.comhi peak,这实际上非常熟悉我试图获得理想输出的最佳尝试,但是是否有一种方法可以在最后将数字相加为2,而不是得到1您指的是哪个[]?在宠物后面的那个?如果是这种情况,我如何删除一套?至于编辑,单词Dog实际上出现在其他数据字段中,我删掉了它们以保持示例的简单性。我将更新问题中的示例输入以说明这一点。下面有两个后续出现的
[]
:map({Animal:[].payload.Animal})| map(select(.Animal))[]]得到了它。使用这两款手机的感觉绝对不好,我只是想不出其他的方法,因为我没有经验。除此之外,考虑到样本输入并尝试实现样本输出,计数函数是否会因为“最喜爱的宠物”字段而过度计数?计数函数是最好的计数方法,但您必须决定要计数什么。
[.. | strings | select(. == "Dog")] | length
def count(s): reduce s as $x (0; .+1);

count(.. | strings | select(. == "Dog"))
count(.. | objects | (.Pets // []) | flatten[] | select(.=="Dog"))