【问题标题】:How to Group By within Object in jq如何在jq中的对象内分组
【发布时间】:2021-11-15 02:10:48
【问题描述】:

我有这个 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 实现这一点? 这似乎是按功能分组,但我无法弄清楚。

【问题讨论】:

  • 您的 JSON 在语法上是有效的,但由于密钥重复而实际上是无用的,所以虽然这个问题可以通过 jq 解决(使用 --stream 选项),但更重要的问题是您的实际问题是否涉及如此可疑的 JSON。

标签: linux bash jq


【解决方案1】:

这是使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 2022-09-29
    • 1970-01-01
    相关资源
    最近更新 更多