我希望有人可以指导我如何将下面的 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)
.[].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)