【问题标题】:JQ: Count number of times string appearsJQ:计算字符串出现的次数
【发布时间】:2018-06-20 05:30:28
【问题描述】:
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(计算狗的数量)。

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

【问题讨论】:

  • 请在您的问题中添加示例输入和该示例输入所需的输出。
  • 我已经更新了问题,感谢您的注意和帮助!
  • 我猜你的例子不是有效的 JSON 代码。
  • 嗨,cyus,我相信它是有效的 JSON(有一个额外的逗号,所以我只是添加了它)
  • 请修复“示例输入”,使其成为有效的 JSON。你可能想使用jq empty 来验证,或者jsonlint.com

标签: arrays bash command-line count jq


【解决方案1】:

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

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

从头开始

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

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

计算流中的项目

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

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

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

“Dog”仅在 .Pets 中出现

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

【讨论】:

  • 嗨,这实际上非常熟悉我试图获得理想输出的最佳尝试,但是有没有办法在最后将数字总结为 2 而不是得到 1 1跨度>
  • 您指的是哪个 [ ]?宠物之后的那个?如果是这种情况,我该如何删除一组?至于编辑,Dog 这个词实际上出现在其他数据字段中,我将它们修剪掉以保持示例简单。我将更新我的问题中的示例输入以解决此问题。
  • 以下有两个尾随出现的[]:map({Animal: .[].payload.animal}) |地图(选择(.Animal))[][]
  • 知道了。使用这两个绝对是一种不好的做法,我只是想不出另一种方法,因为我没有经验。除此之外,考虑到样本输入并尝试实现样本输出,计数函数是否不会由于“最喜欢的宠物”字段而过度计数?
  • 计数功能是最好的计数方法,但您必须决定要计数的内容。
猜你喜欢
  • 2012-06-24
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 2012-02-12
相关资源
最近更新 更多