如何jq没有键(只有值)的嵌套数组并转换为csv

Hen*_*Liu 7 array csv json jq

我希望有人可以指导我如何将下面的 json 转换为我期待的 csv。

非常感谢提前。

更新:感谢提供的解决方案,但我发现有时当第二列只有 1 条记录时数组不存在,下面的示例是“ASite”只有 1 条记录“unixhost1123”与之配对。

源 json

[
  {
    "results": [
      [
        "sm-clust001",
        [
          "163slesm02",
          "163slesm01"
        ]
      ],
      [
        "sm-cssl112",
        [
          "ucsbnchac240",
          "ucsbnchac209",
          "ucsbnchac241",
          "ucsbnchac242"
        ]
      ],
      [
        "ASite",
        "unixhost1123"
      ]
    ]
  }
]
Run Code Online (Sandbox Code Playgroud)

期待 csv

"sm-clust001","163slesm02"
"sm-clust001","163slesm01"
"sm-cssl112","ucsbnchac240"
"sm-cssl112","ucsbnchac209"
"sm-cssl112","ucsbnchac241"
"sm-cssl112","ucsbnchac242"
"ASite","unixhost1123"
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 6

.[].results[]是一组数组。在每个数组中,第一个元素是您想要在第一列中拥有的元素,第二个元素是我们想要循环的另一个数组。

因此,让我们跟踪第一个元素$name(假设这是某种簇名称),然后将其与子数组的每个元素一起输出:

.[].results[] | .[0] as $name | .[1][]? // .[1] | [ $name, . ] | @csv
Run Code Online (Sandbox Code Playgroud)

该位表示.[1][]? // .[1]选择子数组的元素(如果存在),否则选择数组的第二个元素(并假设它是标量)。

在命令行上:

jq -r '.[].results[] | .[0] as $name | .[1][]? // .[1] | [ $name, . ] | @csv' file
Run Code Online (Sandbox Code Playgroud)

给出您的示例文档的结果:

"sm-clust001","163slesm02"
"sm-clust001","163slesm01"
"sm-cssl112","ucsbnchac240"
"sm-cssl112","ucsbnchac209"
"sm-cssl112","ucsbnchac241"
"sm-cssl112","ucsbnchac242"
"ASite","unixhost1123"
Run Code Online (Sandbox Code Playgroud)

该解决方案适用于对用户后续问题的回答中的任意数量的列。

  • 必须查看“jq”代码,一定有一些相当于抱怨不可读的 APL 程序或 Perl 的正则表达式“线路噪音”。:-) (2认同)