如何用jq按电影类型分组统计影片数并忽略无类型条目
用JQ统计电影类型的影片数量
需求说明
给定电影JSON列表,需要统计每种唯一类型对应的影片数量,同时忽略无效类型(包括tag为null的情况),输出以类型为键、数量为值的JSON对象。
输入示例1
[ { "title":"X", "genres":[ { "tag":"Horror" }, { "tag":"Thriller" }, { "tag":"Mystery" } ] }, { "title":"Zero Dark Thirty", "genres":[ { "tag":"Thriller" }, { "tag":"Drama" }, { "tag":"History" }, { "tag":"War" } ] } ]
期望输出1
{ "Horror":1, "Thriller":2, "Mystery":1, "Drama":1, "History":1, "War":1 }
特殊情况输入示例
[ { "title":"Some movie", "genres":[ { "tag": null } ] }, { "title":"Some other movies", "genres":[ { "tag":"Comedy" }, { "tag":"Drama" } ] } ]
解决方法
完全可以用JQ实现,执行以下命令即可:
jq 'reduce .[] as $movie ({}; reduce $movie.genres[] as $genre (.; if $genre.tag != null then .[$genre.tag] += 1 else . end))'
命令解释
reduce .[] as $movie ({}; ...):遍历每个电影对象,初始值为一个空对象,用来存储最终统计结果reduce $movie.genres[] as $genre (.; ...):遍历当前电影的所有类型对象if $genre.tag != null then .[$genre.tag] += 1 else . end:如果类型的tag不为空,则对应类型的计数加1,否则跳过该无效类型
特殊情况验证
针对特殊输入示例,执行命令后会输出:
{ "Comedy": 1, "Drama": 1 }
符合预期,忽略了tag为null的无效类型。
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

