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

时间:2018-06-20 05:30:29

标签: arrays bash command-line count jq

map({Animal: .[].payload.animal})
|   map(select(.Animal))[][]

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

[
  [
    "Dog",
    "Cat"
  ]
]
[
  [
    "Dog",
    "Cat",
    "Bird"
  ]
]

从此输出中,如何构建/添加到我的JQ命令中以获取结果2(狗的总发生次数)。我已经玩了(几个小时!),使用add和select语句的组合来尝试获得所需的输出,但是还没有做到。非常感谢您的帮助!


根据要求:

样本输入:

[{
    "Data": {
        "IsInUS": 1,
        "Pets": [
            ["Dog", "Cat", "Bird"]
        ],
        "Favorite Pet": "Dog"
    },
    "UniqueID": "1234"
},
{
    "Data": {
        "IsInUS": 1,
        "Pets": [
            ["Dog", "Cat", "Bird"]
        ]
        "Favorite Pet": "Cat"
    },
    "UniqueID": "234"
}]

样本输出:2(计算狗的数量)。

我希望仅在“狗”数据字段/密钥中计算“狗”的出现次数

1 个答案:

答案 0 :(得分:0)

主要查询中的最后尾随[]会产生一个流,这对于使用length进行计数来说不是很好。为简单起见,您可以选择:

map({Animal: .[].payload.animal})
|   map(select(.Animal))[]   # <--- JUST ONE []
| flatten
| map(select(. == "Dog"))
| length

从头开始

您可能想考虑简单地计算原始JSON中“狗”的出现次数:

[.. | strings | select(. == "Dog")] | length

计数流中的项目

一种更有效的计数方法是对流中的项目进行计数:

def count(s): reduce s as $x (0; .+1);

count(.. | strings | select(. == "Dog"))

仅在.Pets中出现“狗”的情况

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