【问题标题】:JQ Aggregations and CrosstabsJQ 聚合和交叉表
【发布时间】:2017-09-05 22:42:39
【问题描述】:

因此我有一些数据:

[
  {
    "count": 4,
    "trial_status": "Follow up",
    "date": "2015-06-06"
  },
  {
    "count": 3,
    "trial_status": "Hold",
    "date": "2015-06-06"
  },
  {
    "count": 2,
    "trial_status": "Trial",
    "date": "2015-06-06"
  },
  {
    "count": 1,
    "trial_status": "Trial + Confirm",
    "date": "2015-06-06"
  }....

我想转换成的

{"2015-06-06": {"Trial + Confirm": 1, "Follow Up": 4, "Hold": 3, "Trial": 2}}

我的任何方法都没有取得太大进展,因此非常感谢一些帮助。

【问题讨论】:

    标签: jq


    【解决方案1】:

    这应该可行:

    group_by(.date) | map({
        key: .[0].date,
        value: map({
            key: .trial_status,
            value: .count
        }) | from_entries
    }) | from_entries
    

    关键是使用from_entries 来建立映射。 这是您可以按名称设置“属性”/键的唯一方法。您只需要生成构成对象的键/值对。


    Santiago 指出您可以使用特殊语法按名称动态设置属性。这也行。

    group_by(.date) | map({
        (.[0].date): map({
            (.trial_status): .count
        }) | add
    }) | add
    

    【讨论】:

    • 很好的答案!正如一个毫无意义的有趣功能:from_entries 不是以编程方式设置键名的唯一方法:{(foo): bar} | add 也可以这样做。虽然出于可读性考虑,我个人更喜欢from_entries,但此脚本的行为与您的相同:group_by(.date) | map({(.[0].date): map({(.trial_status): .count}) | add}) | add
    • 哦,谢谢你的提示,我忘记了那个语法。我正在尝试其他根本不起作用的东西。
    【解决方案2】:

    这是使用reducedestructuring variable bindingsetpath 的解决方案

    reduce .[] as {count:$c, trial_status:$s, date:$d} (
      {}
    ; setpath([$d, $s]; $c)
    )
    

    如果此过滤器在filter.jq 中且data.json 包含样本数据,则该命令

    $ jq -M -f filter.jq data.json
    

    生产

    {
      "2015-06-06": {
        "Follow up": 4,
        "Hold": 3,
        "Trial": 2,
        "Trial + Confirm": 1
      }
    }
    

    【讨论】:

      【解决方案3】:

      如果您因为地图内的地图而头晕目眩,或者如果您更喜欢直接的方法(在这种情况下至少也恰好是快速和简单的),请考虑使用reduce,如下所示: reduce .[] as $o ({}; . + {($o.date): (.[$o.date] + {($o.trial_status): $o.count} )})

      感谢 jq 的空语义,这可以简化并缩短为: reduce .[] as $o ({}; .[$o.date] += { ($o.trial_status): $o.count } )

      【讨论】:

        猜你喜欢
        • 2017-05-12
        • 1970-01-01
        • 2015-06-16
        • 1970-01-01
        • 2018-01-15
        • 1970-01-01
        • 2014-09-19
        • 1970-01-01
        • 2016-12-14
        相关资源
        最近更新 更多