Csv

如何在沒有鍵(只有值)的情況下 jq 嵌套數組並轉換為 csv

  • August 23, 2021

我希望有人可以指導我如何將下面的 json 轉換為我期望的 csv。

非常感謝提前。

更新:感謝提供的解決方案,但我發現有時當第二列只有 1 條記錄時數組不存在,下面的範例是“ASite”只有 1 條記錄“unixhost1123”與之配對。

源json

[
 {
   "results": [
     [
       "sm-clust001",
       [
         "163slesm02",
         "163slesm01"
       ]
     ],
     [
       "sm-cssl112",
       [
         "ucsbnchac240",
         "ucsbnchac209",
         "ucsbnchac241",
         "ucsbnchac242"
       ]
     ],
     [
       "ASite",
       "unixhost1123"
     ]
   ]
 }
]

期待 csv

"sm-clust001","163slesm02"
"sm-clust001","163slesm01"
"sm-cssl112","ucsbnchac240"
"sm-cssl112","ucsbnchac209"
"sm-cssl112","ucsbnchac241"
"sm-cssl112","ucsbnchac242"
"ASite","unixhost1123"

.[].results[]是一組數組。在每個數組中,第一個元素是您想要在第一列中擁有的元素,第二個元素是我們想要循環的另一個數組。

因此,讓我們跟踪其中的第一個元素$name(假設這是某種集群名稱),然後將其與子數組的每個元素一起輸出:

.[].results[] | .[0] as $name | .[1][]? // .[1] | [ $name, . ] | @csv

表示.[1][]? // .[1]選擇子數組元素(如果存在)的位,否則選擇數組的第二個元素(並假設它是一個標量)。

在命令行上:

jq -r '.[].results[] | .[0] as $name | .[1][]? // .[1] | [ $name, . ] | @csv' file

結果,給定您的範例文件:

"sm-clust001","163slesm02"
"sm-clust001","163slesm01"
"sm-cssl112","ucsbnchac240"
"sm-cssl112","ucsbnchac209"
"sm-cssl112","ucsbnchac241"
"sm-cssl112","ucsbnchac242"
"ASite","unixhost1123"

此解決方案適用於我對使用者後續問題的回答中的任意數量的列。

引用自:https://unix.stackexchange.com/questions/665444