私が望む行はdescription
その行の後ろにあります。body
はい。
から:
{
"foo": {
"prefix": "foo",
"description": "foo",
"body": [
"line 1",
" line 2"
]
},
"bar": {
"prefix": "bar1",
"description": "bar 1 bar",
"body": [
"line 1",
" line 2",
" line 3",
"...."
]
}
}
到着する:
{
"foo": {
"prefix": "foo",
"body": [
"line 1",
" line 2"
],
"description": "foo"
},
"bar": {
"prefix": "bar1",
"body": [
"line 1",
" line 2",
" line 3",
"...."
],
"description": "bar 1 bar"
}
}
ベストアンサー1
私はあなたが持っている最初のJSON文書があなたが持っているものであり、2番目のJSON文書はあなたが得たいことを示していると仮定します。
使用jq
:
jq '.[] |= ( to_entries | [.[0],.[2],.[1]] | from_entries )' file
最初のビットはto_entries
2つのサブオブジェクトの合計foo
にそれぞれ適用され、それbar
を「アイテム」、つまりキーを持つ配列に変換します。たとえば、オブジェクトは次のようになります。key
value
foo
[
{
"key": "prefix",
"value": "foo"
},
{
"key": "description",
"value": "foo"
},
{
"key": "body",
"value": [
"line 1",
" line 2"
]
}
]
ここでは、配列の3つの要素を0、1、2の順序から0、2、1の順に並べ替えるだけです。つまり、最後の要素を項目に置き換えるだけです。
これが私たちがすることです[.[0],.[2],.[1]]
。
それからfrom_entries
。
データリターンでこれをテストします。
{
"foo": {
"prefix": "foo",
"body": [
"line 1",
" line 2"
],
"description": "foo"
},
"bar": {
"prefix": "bar1",
"body": [
"line 1",
" line 2",
" line 3",
"...."
],
"description": "bar 1 bar"
}
}
各子オブジェクトのキー命名に満足している場合(最後の2つのキーを置き換える代わりに)、次のコマンドは上記と同じ効果を持ちます。
jq '.[] |= { prefix: .prefix, body: .body, description: .description }' file
これは基本的に新しい2つの子オブジェクトfoo
のそれぞれのオブジェクトでbar
あり、そのキーは指定された順序でソートされます。