jq를 사용하여 JSON 객체를 동일한 키와 결합하는 방법

jq를 사용하여 JSON 객체를 동일한 키와 결합하는 방법

다음 코드 조각을 JSON으로 내보냅니다.

{
  "daisy": {
    "dev": {
      "app_url": "example.com",
      "owner": "bob",
      "createat": "2022-06-17T15:31:58Z",
    }
  }
}
{
  "daisy": {
    "dev": {
      "appname": "daisy",
      "flavor": [
        "nodejs"
      ],
      "file": "manifests/daisy.yml"
    }
  }
}

나는 이 객체들을 다음과 같이 결합하고 싶습니다:

{
  "daisy": {
    "dev": {
      "app_url": "example.com",
      "owner": "bob",
      "createat": "2022-06-17T15:31:58Z",
      "appname": "daisy",
      "flavor": [
        "nodejs"
      ],
      "file": "manifests/daisy.yml"
    }
  }
}

어떻게 해야 합니까 jq?

답변1

두 개체를 곱하면 병합됩니다. 다음은 reduce기존 객체를 하나씩 병합하여 지속적으로 새로운 객체를 생성하는 데 사용됩니다.

이를 수행하는 두 가지 유사한 방법이 있습니다.

  1. 사용 -ninputs:reduce

    jq -n 'reduce inputs as $item ({}; . *= $item)' file
    

    inputs전달된 객체를 하나씩 반환하는 함수를 사용합니다 . ( ) 와 -n함께 사용하면 --null-input일반적인 입력 읽기를 비활성화할 수 있습니다.

  2. 사용 -s.[]:reduce

    jq -s 'reduce .[] as $item ({}; . *= $item)' file
    

    이는 원시 데이터 -s( --slurp)를 배열로 읽고 reduce배열을 반복하는 데 사용됩니다. 입력이 크면 메모리가 매우 비효율적이고 속도가 느려질 수 있습니다.

데이터에 대한 결과( createat행에서 쉼표를 제거하여 수정):

{
  "daisy": {
    "dev": {
      "app_url": "example.com",
      "owner": "bob",
      "createat": "2022-06-17T15:31:58Z",
      "appname": "daisy",
      "flavor": [
        "nodejs"
      ],
      "file": "manifests/daisy.yml"
    }
  }
}

두 개 이상의 객체가 동일한 키를 공유하고 해당 키가스칼라또는대량으로이면 입력의 후속 개체가 이 값을 덮어씁니다.

관련 정보