【问题标题】:Summarize multiple values with jq reduce用 jq reduce 汇总多个值
【发布时间】:2018-11-22 16:22:50
【问题描述】:

如何使用jq的reduce函数来处理多个操作?

给定一个模型:

{
  "usage" : {
    "os:linux" : {
      "2018_11_18" : {
        "amount" : 601046342,
        "credits" : 99783
      },
      "2018_10_18" : {
        "amount" : 839785106,
        "credits" : 173121
      }
    }
  }
}

还有JQ文件:

reduce .usage."os:linux"[] as $item (
{"credits":0,"minutes":0}; 
."credits" += $item.credits
) 

我明白了:

{
  "credits": 272904,
  "minutes": 0
}

很酷,但我想综合这两个领域,比如:

reduce .usage."os:linux"[] as $item (
{"credits":0,"minutes":0}; 
."credits" += $item.credits,
."minutes" += $item.amount /1000/60
) 

分号导致错误,逗号通过,但只处理最后一个任务,即,

{
  "credits": 0,
  "minutes": 24013.85746666667
}

【问题讨论】:

    标签: json jq reduce


    【解决方案1】:

    总是有明确的方式:

    reduce .usage."os:linux"[] as $item (
      {"credits": 0, "minutes": 0 }; 
      {
        "credits": (.credits + $item.credits),
        "minutes": (.minutes + $item.amount / 60000) 
      }
    )
    

    【讨论】:

      【解决方案2】:

      或者更简洁:

      reduce .usage."os:linux"[] as $item (
        {}; 
        .credits += $item.credits
        | .minutes += ($item.amount / 60000) )
      

      或者...

      或者将归约抽象为通用效用函数sigma/1

      def sigma(s): reduce s as $s (null; . + $s);
      
      .usage."os:linux"
      | {credits: sigma(.[].credits),
         minutes: (sigma(.[].amount) / 60000) }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-27
        相关资源
        最近更新 更多