shell jq合并来自不同对象的数据

8ulbf1ek  于 2023-08-07  发布在  Shell
关注(0)|答案(1)|浏览(113)

我试图合并这些对象(最好是追加来自公共x值的数组),但没有任何运气。我知道这是一个noop,但它是最接近我认为我想要的,不会出错的东西:

jq -n -rSC 'def data: {"a": {"x": "t", "y": ["a","b"]}, "b": {"x": "t", "y": ["c","d"]}, "c": {"x": "r", "y": ["a","c"]}}; data | .[] | reduce . as $item ({}; . + $item)'
{
    "x": "t",
    "y": [
        "a",
        "b"
    ]
}
{
    "x": "t",
    "y": [
        "c",
        "d"
    ]
}
{
    "x": "r",
    "y": [
        "a",
        "c"
    ]
}

字符串
预期产出将是:

{
    "x": "t",
    "y": [
        [
            "a",
            "b”
        ],
        [
            "c",
            "d"
        ]
    ]
}
{
    "x": "r",
    "y": [
        [
            "a",
            "c"
        ]
    ]
}


这是示例代码。我真正喜欢的是这样的合并:

gcloud compute snapshots list --project "foo" --format=json | jq -rSC '.[] | select((.sourceDisk | test("data-disk$")) and (.autoCreated | true)) | {(.sourceDisk | match("/([^/]+$)").captures[0].string): [.diskSizeGb, .name, .creationTimestamp]}'


我对gcloud命令的任何输出都很在行,它允许我在一个对象下拥有一个示例的快照数据。但我希望它与我的示例数据非常相似。
我试过简单的add,上面的reduces,map/map_value

hmae6n7t

hmae6n7t1#

如果您知道xy的实际名称,则可以使用以下reduce直接寻址它们(设置.x并追加到.y):

(reduce data[] as {$x,$y} ({}; .[$x] |= (.x = $x | .y += [$y])))[]

个字符
Demo
或者使用一种更函数化的方法,group_by公共字段:

[data[]] | group_by(.x)[] | {x: .[0].x, y: map(.y)}
{
  "x": "r",
  "y": [
    [
      "a",
      "c"
    ]
  ]
}
{
  "x": "t",
  "y": [
    [
      "a",
      "b"
    ],
    [
      "c",
      "d"
    ]
  ]
}

的字符串
Demo

相关问题