json - jq:添加嵌套数字?
问题描述
在jq
中,如何添加嵌套在流对象中的数字?
例子:
{"game":
{"player1": {"score": 2}}}
{"game":
{"player1": {"score": 4}}}
我可以使用两个jq
调用添加这些数字:
$ cat foo.json | jq '.game.player1.score' | jq --slurp 'add'
6
怎么可以一jq
通电话?
另外,如何分别将两个不同玩家的分数相加?
{"game":
{"player1": {"score": 2},
"player2": {"score": 20}}}
{"game":
{"player1": {"score": 4},
"player2": {"score": 40}}}
$ cat foo.json | jq '???'
{"player1": 6, "player2": 60}
解决方案
首先,这是@OguzIsmail 第一个问题的第一个解决方案的变体。它用于验证泛型函数的有用性:
def sigma(s): reduce s as $x (0; .+$x);
有了这个,并使用 -n 命令行选项,给定问题的解决方案很简单:
sigma(inputs.game.player1.score)
第二个问题
同样的通用性:
def sigmas(stream; f):
reduce stream as $s (null;
[., ($s | f)] | transpose | map(add));
sigmas(inputs | .game; [.player1.score, .player2.score])
| {player1: .[0], player2: .[1]}
请注意,sigmas
这里定义的可以处理任意多个加法。一个更通用的解决方案,避免将总和指定为列表,留给读者作为一个(简单的)练习:-)
jq.jq
通常,通用函数可以包含在“标准 jq 库”中。例如,如果你的实用函数在 ~/.jq/jq.jq 中,那么假设 pwd 没有不同的 jq.jq,你可以写(对于第一个问题的解决方案):
jq -n 'include "jq"; sigma(inputs.game.player1.score)' foo.json
库的强大包含
include
为了避免与模块路径相关的困难,有时在orimport
指令中指定路径是有意义的,例如:
jq -n 'include "jq" {search: "~/jq"}; ...'
推荐阅读
- python - tensorflow MLP 神经网络没有给出合理的结果
- uwp - 如何使实际的 UWP 应用程序本身符合 .net 标准 2.0?
- mysql - MySQL 长响应时间
- javascript - 如何仅为以“spec.js”结尾的文件添加开玩笑测试覆盖率
- node.js - Handlebars 中的 #each 助手不会遍历带括号的键
- apache-kafka - 使用组管理运行kafka spring时寻求分区结束?
- javascript - 强制 iOS 从 HTML5 Canvas 下载图像(使用纯 javascript)并保持应用 CSS 过滤器
- php - 保护我的 php 包括来自邮件用户
- javascript - Laravel 和 Javascript - 从数据库中删除多行
- sql - 在 MS Access(转置)中将多个表列在一个表中