如何解决使用 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 举报,一经查实,本站将立刻删除。