使用jq根据group by统计元素

问题描述 投票:0回答:1

我有一个这样的电影清单:

[
   {
      "title":"X",
      "genres":[
         {
            "tag":"Horror"
         },
         {
            "tag":"Thriller"
         },
         {
            "tag":"Mystery"
         }
      ]
   },
   {
      "title":"Zero Dark Thirty",
      "genres":[
         {
            "tag":"Thriller"
         },
         {
            "tag":"Drama"
         },
         {
            "tag":"History"
         },
         {
            "tag":"War"
         }
      ]
   }
]

我想查询所有独特的类型并计算电影的数量,输出如下所示:

{
   "Horror":1,
   "Thriller":2,
   "Mystery":1,
   "Drama":1,
   "History":1,
   "War":1
}

这可以通过

jq
实现吗?

json aggregate jq
1个回答
0
投票

是的,是的。

  1. 将所有流派提取到数组中
  2. 团体流派
  3. 映射到键值对(键=组中的任何元素,我们取第一个;值=组中元素的数量)
  4. 从键值对构建对象
map(.genres[].tag)
| group_by(.)
| map({ key:first, value:length })
| from_entries

输出:

{
  "Drama": 1,
  "History": 1,
  "Horror": 1,
  "Mystery": 1,
  "Thriller": 2,
  "War": 1
}

或者,使用基于

reduce
的方法并简单地增加一个计数器:

reduce .[].genres[].tag as $genre ({}; .[$genre] += 1)

这可能比构建数组和分组更有效。

© www.soinside.com 2019 - 2024. All rights reserved.