テキストをJSONに変更

テキストをJSONに変更

入力データの例(^- 区切りフィールド):

C-11^Mark^Docking AWS
C-12^Mark^Docking AWS
C-13^Lay^Ploting
C-14^Lay^Ploting
C-15^Lay^Ploting
C-16^Vincent^GPU Calc
C-17^Vincent^GPU Calc
C-18^Vincent^GPU Calc
C-19^Vincent^GPU Calc

私は次のコマンドを使用します。

 jq -Rn '
    [inputs | select(. != "") / "^"]
    | reduce .[] as [$container, $user, $job] ({};
      .[$job] += [{$user, $container}]
    )
    'test.csv > test.json

次のJSON出力が正しく表示されます。

 "Docking AWS\r": [
    {
      "user": "Mark",
      "container": "C-11"
    },
    {
      "user": "Mark",
      "container": "C-12"
    }
  ],

...しかし、次のJSONのようなフォーマットを指定したいと思います。

Docking AWS
user: Mark
container: C-11,C-12


 "Docking AWS\r": [
    {
      "user": "Mark",
      "container": "C-11","C12"
    },

この目標をどのように達成できますか?

++編集++

{
  "job": "Docking AWS",
  "user": "Mark",
  "container": [
    "C-11",
    "C-12"
 ]
}

この形式をどのように変換しますか?

ベストアンサー1

私はあなたが次のようなことをしたいとします。

{
  "Docking AWS": {
    "user": "Mark",
    "container": [
      "C-11",
      "C-12"
    ]
  },
  "Ploting": {
    "user": "Lay",
    "container": [
      "C-13",
      "C-14",
      "C-15"
    ]
  },
  "GPU Calc": {
    "user": "Vincent",
    "container": [
      "C-16",
      "C-17",
      "C-18",
      "C-19"
    ]
  }
}

これは、以下reduceを使用して元の行の分割部分文字列から結果構造を構築することによって達成できます。

jq -Rn '
    reduce ( inputs / "^" ) as [$container,$user,$job] ({}; 
        .[$job] |= ( .user      |=   $user |
                     .container += [ $container ] )
    )' file

reduceこれは、入力を読み取り、それらをそれぞれ3つの要素で構成される短い配列に分割するために使用されます。空のオブジェクトで始まり、サブオブジェクトを更新して新しいキーが追加されます。キーをに設定し、オブジェクトの配列に追加して、キーが$job参照するサブオブジェクトを更新します。user$user$containercontainer

このコードとあなたのコードの主な違いは、各入力行にオブジェクトを追加するのではなく、結果のオブジェクトを更新することです。私も.[$job].containerそれを配列として扱います。

DOSテキストファイルを使用しているように見えるため、入力データをUnixテキストファイルに変換するか、各行のdos2unix末尾からキャリッジリターンを手動で削除する必要があるかもしれませんjqinputs / "^"に変更inputs | rtrimstr("\r") / "^")。


私が解釈した方法で修正された質問は、各タスクを最上位オブジェクトのキーとして使用するのではなく、最上位タスク配列を作成する必要があります。文字列を値のキーとして取得し、生成されたオブジェクトを配列に入れるreduce操作を含めるように呼び出しを少し調整するだけです。job$jobreduce

jq -Rn '
    reduce ( inputs / "^" ) as [$container,$user,$job] ({}; 
        .[$job] |= ( .job       |=   $job  |
                     .user      |=   $user |
                     .container += [ $container ] )
    ) | [ .[] ]' file

質問のデータが与えられると、次のものが生成されます。

[
  {
    "job": "Docking AWS",
    "user": "Mark",
    "container": [
      "C-11",
      "C-12"
    ]
  },
  {
    "job": "Ploting",
    "user": "Lay",
    "container": [
      "C-13",
      "C-14",
      "C-15"
    ]
  },
  {
    "job": "GPU Calc",
    "user": "Vincent",
    "container": [
      "C-16",
      "C-17",
      "C-18",
      "C-19"
    ]
  }
]

おすすめ記事