次の形式のjsonファイルがたくさんあります。
サンプルfile1
:
{
"attributes": [
{
"name": "Node",
"value": "test"
}
]
}
サンプルfile2
:
{
"attributes": [
{
"name": "version",
"value": "11.1"
}
]
}
など。
たとえば、それらをすべて1つのjsonファイルにマージする必要があります。
{
"attributes": [
{
"name": "Node",
"value": "test"
},
{
"name": "version",
"value": "11.1"
}
]
}
誰でもjqのソリューションを提供できますか?
答え1
jq
解決策:
jq -s '{ attributes: map(.attributes[0]) }' file*.json
-s
(--slurp
) - それぞれに対してフィルタを実行する代わりにJSON入力のオブジェクトは、入力ストリーム全体を大きな配列として読み込み、フィルタを一度だけ実行します。
出力例:
{
"attributes": [
{
"name": "Node",
"value": "test"
},
{
"name": "version",
"value": "11.1"
}
]
}
答え2
比較するとRomanPerekrestのソリューション、オブジェクト全体を再生成せずにターゲットフィールドをマージできます。
jq -s '.[0].attributes = [.[].attributes | add] | .[0]' file*.json
.attributes
これにより、他のすべてのファイルをまとめて最初のjsonファイル全体が返されます。
答え3
jq
フルルック音は含まれていませんが、inputs
以下を含む別のバリエーションです。reduce
jq -n 'reduce inputs as $in ({}; reduce ($in|keys_unsorted)[] as $k (.;
.[$k] += $in[$k]))' file1 file2
答え4
使用yq
(からhttps://kislyuk.github.io/yq/) 次に、tomlq
(同じyq
ディストリビューションで)次を使用してTOMLからJSONに返します。
$ yq -t '.' file1 file2 | tomlq .
{
"attributes": [
{
"name": "Node",
"value": "test"
},
{
"name": "version",
"value": "11.1"
}
]
}
これはyq -t
、両方のTOML文書の接続が作成されるために機能します。
[[attributes]]
name = "Node"
value = "test"
そして
[[attributes]]
name = "version"
value = "11.1"
規則に従ってTOMLこれは、作成したいJSONドキュメントとまったく同じです(attributes
配列なので)。したがってtomlq
、JSONに再変換すると正しい操作が行われます。
このユーティリティを使用して同等の変換を実行できますyj
(https://github.com/sclevine/yj)また:
yj -tj < <( cat <( yj -jt <file1 ) <( yj -jt <file2 ) )
または手続き的置換なしでcat
、
{ yj -jt <file1; yj -jt <file2; } | yj -tj
yj -jc
yj -cj
代わりにyj -jt
、およびを使用して、HashicorpのHCL形式を使用して同じタイプの往復を実行することもできますyj -tj
。