jq 또는 다른 도구를 사용하여 json 파일을 병합하는 방법은 무엇입니까?

jq 또는 다른 도구를 사용하여 json 파일을 병합하는 방법은 무엇입니까?

질문을 좀 더 구체적으로 수정하세요. 2개의 JSON 파일이 있으며, 그 중 첫 번째 파일에는 몇 개의 청크만 있습니다. 보시다시피 두 번째에는 블록이 거의 없고 리디렉션 규칙도 거의 추가되지 않습니다.

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

출력은 두 파일의 병합이어야 합니다. 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

추가 변환이 필요한 경우 질문을 편집하고 필요한 내용에 대한 간단한 요약을 제공하십시오(예상 결과를 실제 출력과 한 줄씩 비교하지 않았습니다).

편집하다

필요한 변환의 일반적인 특성에 대해서는 아직 잘 모르겠지만 형식이 예제와 정확히 같고 원하는 것은 values첫 번째 파일의 필드를 values두 번째 파일의 필드 내용 으로 바꾸는 것뿐입니다. 다른 사람들은 모두 유지하고 시도해 보세요.

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

여기서 파일은 첫 번째 파일과 두 번째 파일 과 마찬가지로 -s배열로 반환됩니다 . 그런 다음 정적 경로만 선택하고 일치하는 단일 필드를 먼저 업데이트합니다..[0].[1]

개체의 순서나 개수가 가변적이거나 일치하는 개체에서만 교체가 작동하는 경우 질문을 업데이트하세요.

답변2

내가 가장 좋아하는 JSON 및 YAML 병합 도구는 다음과 같습니다.가문비. 출력 JSON을 가져오는 명령은 다음과 같습니다.

spruce merge file1.json file2.json | spruce json

답변3

.name첫 번째 JSON 파일 배열의 키와 두 번째 파일의 키를 기반으로 .name두 파일 간의 관계형 JOIN 작업을 수행합니다 .

.name동일한 값을 갖는 요소 의 경우 두 번째 파일에서 요소가 선택되고, 그렇지 않으면 첫 번째 파일에서 요소가 선택됩니다.

jq -s '[ JOIN(INDEX(.[1]; .name); .[0][]; .name; .[1] // .[0]) ]' file1 file2

.name비슷한 방식으로 두 번째 파일과 동일한 값을 가진 키를 가진 첫 번째 파일의 배열 항목을 모두 선택합니다. 두 번째 파일의 데이터로 이러한 항목을 업데이트합니다.

jq -s '[ .[1] as $u | .[0][] | select(.name == $u.name) |= $u ]' file1 file2

두 변형 모두(첫 번째 명령의 끝 부분 제외)에서 .[0]첫 번째 파일(배열)의 데이터이지만 두 번째 파일(단일 개체)의 데이터 .[1]는 아닙니다 . 질문에 표시된 입력이 주어지면 두 명령 모두 예상된 출력을 생성합니다.

관련 정보