以下のようにxyz.jsonというjsonファイルがあります。
[
{
"annotations": [ "a" , "b" , "c" ],
"class": "image",
"filename": "vc00_02201.png"
},
{
"annotations": [],
"class": "image",
"filename": "vc00_02202.png"
}
{
"annotations": [],
"class": "image",
"filename": "vc00_02203.png"
},
{
"annotations": [],
"class": "image",
"filename": "vc00_02204.png"
}
]
シェルスクリプトを使用して、同じxyz.jsonファイル内の「filename」:「vc00_02201.png」の「annotations」オブジェクトを「filename」:「vc00_02204.png」の「annotations」にコピーする必要があります。予想出力:
[
{
"annotations": [ "a" , "b" , "c" ],
"class": "image",
"filename": "vc00_02201.png"
},
{
"annotations": [],
"class": "image",
"filename": "vc00_02202.png"
}
{
"annotations": [],
"class": "image",
"filename": "vc00_02203.png"
},
{
"annotations": [ "a" , "b" , "c" ],
"class": "image",
"filename": "vc00_02204.png"
}
]
答え1
$cat xyz.json | jq '.[3].annotations=.[0].annotations'
答え2
これは次のようにも達成できます。jtc
一行:
bash $ cat xyz.json | jtc -w'<vc00_02204.png>[-1][annotations]' -eu jtc -w'<vc00_02201.png>[-1][annotations]' xyz.json \;
[
{
"annotations": [
"a",
"b",
"c"
],
"class": "image",
"filename": "vc00_02201.png"
},
{
"annotations": [],
"class": "image",
"filename": "vc00_02202.png"
},
{
"annotations": [],
"class": "image",
"filename": "vc00_02203.png"
},
{
"annotations": [
"a",
"b",
"c"
],
"class": "image",
"filename": "vc00_02204.png"
}
]
bash $
もちろん、配列の直接メンバーを参照して行うこともできます。たとえば、次のようになります。
bash $ cat xyz.json | jtc -w'[3][annotations]' -eu jtc -w'[0][annotations]' xyz.json \;
しかし、ファイル名で相互参照する点は議論の余地があります。