首页 > 解决方案 > 如何在jq中的对象内分组

问题描述

我有这个 JSON 对象

{
    "id_1": {
        "day_1": {
            "loc_sec": 886,
            "int_sec": null
        }
    },
    "id_1": {
        "day_2": {
            "loc_sec": 575,
            "int_sec": null
        }
    },
    "id_2": {
        "day_1": {
            "loc_sec": 140,
            "int_sec": null
        }
    },
    "id_2": {
        "day_2": {
            "loc_sec": 138,
            "int_sec": null
        }
    }
}

我想要这样的输出

{
    "id_1": {
        "day_1": {
            "loc_sec": 886,
            "int_sec": null
        },
        "day_2": {
            "loc_sec": 575,
            "int_sec": null
        }
    },
    "id_2": {
        "day_1": {
            "loc_sec": 140,
            "int_sec": null
        },
        "day_2": {
            "loc_sec": 138,
            "int_sec": null
        }
    }
}

如何使用 bash 脚本和 jq 实现这一点?这似乎是按功能分组的,但我无法弄清楚。

标签: linuxbashjq

解决方案


这是使用 jq 的 --stream 选项的解决方案:

jq -n --stream '
  def stream:
    foreach ((inputs | select(length==2)), null) as $kv (null;
      if $kv == null then .emit = .value
      else .emit = null
      | $kv[0][0] as $k
      | if .k and ($k != .k) 
        then .emit = .value | .value = null 
        else . 
        end
      | .value |= setpath($kv[0]; $kv[1])
      | .k = $k
      end;
    select(.emit).emit);

  [stream] | add
' input.json

推荐阅读