jqや他のツールを使ってjsonファイルをマージする方法は?

jqや他のツールを使ってjsonファイルをマージする方法は?

質問をより具体的に修正してください。 2つのJSONファイルがあり、そのうちの最初のファイルにはいくつかのチャンクしかありません。ご覧のとおり、2番目のブロックはほとんどなく、リダイレクトルールもほとんど追加されません。

"values": [
  "/businessclass/articles/money.page",
  "/businessclass/articles/1.page",
  "/businessclass/articles/2.page"
],

出力は2つのファイルのマージでなければなりません。 jsonファイル1への変更とJson 2への更新されたリダイレクトルールが含まれています。

JSONファイル1

[
  {
    "name": "caching",
    "options": {
      "behavior": "MAX_AGE",
      "mustRevalidate": false,
      "ttl": "10m",
      "defaultTtl": "30m"
    }
  },
  {
    "name": "/businessclass/articles/money.page",
    "children": [],
    "behaviors": [
      {
        "name": "redirect",
        "options": {
          "destinationPathOther": "/businessclass/articles/finance-and-operations.page"
        }
      }
    ],
    "criteria": [
      {
        "name": "path",
        "options": {
          "matchOperator": "MATCHES_ONE_OF",
          "values": [
            "/businessclass/articles/money.page"
          ],
          "matchCaseSensitive": false
        }
      }
    ],
    "criteriaMustSatisfy": "all",
    "comments": ""
  }
]

JSONファイル2

{
  "name": "/businessclass/articles/money.page",
  "children": [],
  "behaviors": [
    {
      "name": "redirect",
      "options": {
        "destinationPathOther": "/businessclass/articles/finance-and-operations.page"
      }
    }
  ],
  "criteria": [
    {
      "name": "path",
      "options": {
        "matchOperator": "MATCHES_ONE_OF",
        "values": [
          "/businessclass/articles/money.page",
          "/businessclass/articles/1.page",
          "/businessclass/articles/2.page"
        ],
        "matchCaseSensitive": false
      }
    }
  ],
  "criteriaMustSatisfy": "all",
  "comments": ""
}

期待される出力

[
  {
    "name": "caching",
    "options": {
      "behavior": "MAX_AGE",
      "mustRevalidate": false,
      "ttl": "10m",
      "defaultTtl": "30m"
    }
  },
  {
    "name": "/businessclass/articles/money.page",
    "children": [],
    "behaviors": [
      {
        "name": "redirect",
        "options": {
          "destinationPathOther": "/businessclass/articles/finance-and-operations.page"
        }
      }
    ],
    "criteria": [
      {
        "name": "path",
        "options": {
          "matchOperator": "MATCHES_ONE_OF",
          "values": [
            "/businessclass/articles/money.page",
            "/businessclass/articles/1.page",
            "/businessclass/articles/2.page"
          ],
          "matchCaseSensitive": false
        }
      }
    ],
    "criteriaMustSatisfy": "all",
    "comments": ""
  }
]

素晴らしい。ルールの順序は変更されることがあります。また、新しい名前の新しいルールをjsonファイルに追加することもできます(例: "name": "/businessclass/articles/money.page")。したがって、どのような変更が発生してもデルタを検索し、それに応じてファイルをマージする必要があります。あるいは、マージされた変更を含む新しいjsonファイルを作成することもできます。

ベストアンサー1

あなたの質問を正しく理解したら、各ファイルのオブジェクトを含む配列を出力したいと思います。この場合、すでに-sこれを行っているので、次の作業を実行するだけです。

jq -s . file1 file2

追加の変換が必要な場合は、質問を編集し、必要な内容の簡単な要約を提供してください(予想結果を実際の出力と1行ずつ比較しませんでした)。

編集する

必要な変換の一般的な特性についてはまだよくわかりませんが、フォーマットが例とまったく同じであり、必要なのは、最初のvaluesファイルのフィールドをvalues2番目のファイルのフィールドの内容に置き換えることだけです。他の人はみんな維持して試してみてください。

jq -s '.[0][1].criteria[0].options.values=.[1].criteria[0].options.values' file1 file2

ここで、ファイルは最初のファイルと2番目のファイルと同様に配列-sとして返されます。次に、静的パスのみを選択し、一致する単一のフィールドを最初に更新します。.[0].[1]

オブジェクトの順序や数が可変である場合、または一致するオブジェクトでのみ置換が機能する場合は、質問を更新してください。

おすすめ記事