複数のjsonファイルを共通オブジェクトにマージして1つにまとめる

複数のjsonファイルを共通オブジェクトにマージして1つにまとめる

次の形式の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に再変換すると正しい操作が行われます。


このユーティリティを使用して同等の変換を実行できますyjhttps://github.com/sclevine/yj)また:

yj -tj < <( cat <( yj -jt <file1 ) <( yj -jt <file2 ) )

または手続き的置換なしでcat

{ yj -jt <file1; yj -jt <file2; } | yj -tj

yj -jcyj -cj代わりにyj -jt、およびを使用して、HashicorpのHCL形式を使用して同じタイプの往復を実行することもできますyj -tj

関連情報