キーなし(値のみ)入れ子になった配列をjqしてcsvに変換する方法

キーなし(値のみ)入れ子になった配列をjqしてcsvに変換する方法

誰かが以下のjsonを私が期待するcsvに変換する方法を案内してくれることを願っています。

よろしくお願いします。

アップデート:提供されたソリューションに感謝します。ただし、2番目の列にレコードが1つしかない場合、配列が存在しないことがあります。以下の例は、「unixhost1123」とペアになっているレコードが1つしかない「ASite」です。

ソース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"

ベストアンサー1

.[].results[]配列のセットです。各配列では、最初の要素は最初の列に含める要素であり、2番目の要素は繰り返す別の配列です。

$nameしたがって、最初の要素(一種のクラスタ名と仮定)を追跡し、サブ配列の各要素と一緒に出力してみましょう。

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

このビットは、.[1][]? // .[1]サブ配列の要素がある場合に選択され、それ以外の場合は配列の2番目の要素が選択されることを示します(スカラーであると仮定)。

コマンドラインから:

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"

このソリューションは複数の列に適用されます。私の答えユーザーへフォローアップの質問

おすすめ記事