繁体   English   中英

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

[英]How can I add calculated values to exported csv when using JQ?

我有 json 数据,如下所示

{"lastUpdateId":18891938,
"bids":[
    ["1","50"],
    ["2","40"],
    ["3","30"],
    ["4","20"],
    ["5","10"]
],
"asks":[
    ["6","10"],
    ["7","20"],
    ["8","30"],
    ["9","40"],
    ["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","10","50",500
"bids","1","50",50
"bids","2","40",80
"bids","3","30",90
"bids","4","20",80
"bids","5","10",50

如果我想要另一个列来表示所有询价的最小值(这里是 6)?、每个询价和出价的总和,以及每个询价和出价的总和的比率?

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

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

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

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

首先,一个助手function:

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

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

  ([.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 要消除所有引号,您可以通过调用join(",")替换对@csv的调用,但结果不能保证是您期望的 CSV。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM