使用 JQ 时如何将计算值添加到导出的 csv?

如何解决使用 JQ 时如何将计算值添加到导出的 csv?

我有下面这样的json数据

{"lastUpdateId":18891938,"bids":[
    ["1","50"],["2","40"],["3","30"],["4","20"],["5","10"]
],"asks":[
    ["6","10"],["7",["8",["9",["10","50"]
]}

那么下面的代码就可以像这样导出CSV的结果

jq -r keys[] as $k  | select(.[$k]|type=="array")  | [$k]+.[$k][] | .[length]= (.[-2:]|map(tonumber)|.[0]*.[1]) |@csv

结果:

"asks","6","10",60
"asks","7","20",140
"asks","8","30",240
"asks","9","40",360
"asks","50",500
"bids","1",50
"bids","2",80
"bids","3",90
"bids","4","5",50

如果我想要其他列作为所有询问的最小值(这里是 6)怎么办?, 每次要价和出价的金额,以及与每次要价和出价的金额的比率?

所以我想要这样的 CSV 结果(第 4-6 列是我想要的新数据)

asks,6,10,60,1300,0.046153846
asks,7,20,140,0.107692308
asks,8,30,240,0.184615385
asks,9,40,360,0.276923077
asks,50,500,0.384615385
bids,1,350,0.142857143
bids,2,80,0.228571429
bids,3,90,0.257142857
bids,4,5,0.142857143

6 is minimum value for asks. 1300 is total sum for asks(60,500),350 is total sum for bids(50,50),and the last values for each line is ratio(4th col/6th col)

https://jqplay.org/s/2Qsdopx8A4

解决方法

首先是一个辅助函数:

def mul: (.[0]|tonumber) * (.[1]|tonumber);

接下来,我们可以通过首先计算“ask”值的最小值来调整您提到的解决方案:

  ([.asks[][] | tonumber] | min) as $min
  | keys[] as $k 
  | select(.[$k]|type=="array")
  | ([.[$k][] | mul] | add) as $sum
  | [$k]+.[$k][] 
  | (.[-2:]|mul) as $c4
  | . + [$c4,$min,$sum,$c4 / $sum]
  | @csv

要消除数值的引号,您可以使用 tonumber。要消除所有引号,您可以将调用 @csv 替换为调用 join(","),但结果不能保证是您期望的 CSV。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?