代码之家  ›  专栏  ›  技术社区  ›  Christian Bongiorno

如何在jq中创建一个扁平的串联序列

jq
  •  1
  • Christian Bongiorno  · 技术社区  · 3 年前

    这是我掌握的数据:

    [
      {
        "repo": "bar/foo/bat",
        "tags": [
          "0.0.4-22.09"
        ]
      },
      {
        "repo": "thing/foo/baz",
        "tags": [
          "0.0.2-22.09",
          "0.0.3-22.09"
        ]
      }
    ]
    

    我想要的是一个扁平的列表 repo:tag 对于每个条目

    "bar/foo/bat:0.0.4-22.09"
    "thing/foo/baz:0.0.2-22.09"
    "thing/foo/baz:0.0.3-22.09"
    

    我不太清楚该怎么表达

    1 回复  |  直到 3 年前
        1
  •  3
  •   pmf    3 年前

    如果您知道字段名称,只需使用 + .使用 [] on数组将自动迭代它们的项。

    .[] | .repo + ":" + .tags[]
    

    Demo

    如果您不知道它们的名称,请创建一个项目数组数组(去掉对象),并如上所述迭代内部数组,同时依次减少外部数组,例如使用 until :

    .[] | map([.[]? // .]) | until(has(1) | not;
      .[:2] |= [[.[0][] + ":" + .[1][]]]
    )[][]
    

    Demo

    输出:

    "bar/foo/bat:0.0.4-22.09"
    "thing/foo/baz:0.0.2-22.09"
    "thing/foo/baz:0.0.3-22.09"
    

    要输出不带JSON编码的字符串(~不带引号),请使用 -r (或 --raw-output )调用时的标志 jq 。