入力データの例(^
- 区切りフィールド):
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
$container
container
このコードとあなたのコードの主な違いは、各入力行にオブジェクトを追加するのではなく、結果のオブジェクトを更新することです。私も.[$job].container
それを配列として扱います。
DOSテキストファイルを使用しているように見えるため、入力データをUnixテキストファイルに変換するか、各行のdos2unix
末尾からキャリッジリターンを手動で削除する必要があるかもしれませんjq
(inputs / "^"
に変更inputs | rtrimstr("\r") / "^"
)。
私が解釈した方法で修正された質問は、各タスクを最上位オブジェクトのキーとして使用するのではなく、最上位タスク配列を作成する必要があります。文字列を値のキーとして取得し、生成されたオブジェクトを配列に入れるreduce
操作を含めるように呼び出しを少し調整するだけです。job
$job
reduce
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"
]
}
]