JQ를 사용하여 두 JSON의 여러 배열을 병합하는 방법

JQ를 사용하여 두 JSON의 여러 배열을 병합하는 방법

아래에 정의된 것과 동일한 구조를 가진 두 개의 JSON 파일( file1.json및 ) 이 있고 아래와 같이 두 개의 배열 목록이 있습니다.file2.json

첫 번째 파일은 ( file1.json)입니다.

{
  "Lists1": [
   {
      "point": "a",
      "coordinates": [
        2289.48096,
        2093.48096
      ]
   }
  ],
  "Lists2": [
   {
      "point": "b",
      "coordinates": [
        2289.48096,
        2093.48096
      ]
   }
 ]
}

두 번째 파일은 ( file2.json)입니다.

{
  "Lists1": [
   {
      "point": "c",
      "coordinates": [
        2289.48096,
        2093.48096
      ]
   }
  ],
  "Lists2": [
   {
      "point": "d",
      "coordinates": [
        2289.48096,
        2093.48096
      ]
   }
 ]
}

따라서 내 예상 결과는 다음과 같습니다.

{
  "Lists1": [
   {
      "point": "a",
      "coordinates": [
        2289.48096,
        2093.48096
      ]
   },
   {
      "point": "c",
      "coordinates": [
        2289.48096,
        2093.48096
      ]
   }
  ]
  "Lists2": [
   {
      "point": "b",
      "coordinates": [
        2289.48096,
        2093.48096
      ]
   },
   {
      "point": "d",
      "coordinates": [
        2289.48096,
        2093.48096
      ]
   }
 ]
}

이 두 파일을 병합(병합)하는 방법을 사용하려고 합니다 jq. 아래 명령을 사용하여 찾았지만 이것은 목록에서만 작동합니다.

jq -n '{ list1: [ inputs.list1 ] | add }' file1.json file2.json

list1sum 을 결합하기 위해 이 함수를 수정하는 방법이 있습니까 list2?

답변1

최상위 키가 모든 문서에서 항상 동일하다고 가정하고 키를 별도의 변수로 추출한 다음 해당 키의 데이터를 줄입니다(누적).

jq -s '
    (.[0] | keys[]) as $k |
    reduce .[] as $item (null; .[$k] += $item[$k])' file*.json

를 사용하면 -s모든 입력을 단일 배열로 읽습니다.

Lists1이는 키 와 각 문서를 어느 정도 반복하여 Lists2데이터를 null처음부터 새로운 구조로 축적합니다.

입력 JSON 문서의 형식이 올바르다고 가정합니다.

{
"Lists1": [{"point":"a","coordinates":[2289.48096,2093.48096]}],
"Lists2": [{"point":"b","coordinates":[2289.48096,2093.48096]}]
}
{
"Lists1": [{"point":"c","coordinates":[2289.48096,2093.48096]}],
"Lists2": [{"point":"d","coordinates":[2289.48096,2093.48096]}]
}

두 개의 개체가 포함된 다음과 같은 결과 문서를 얻게 됩니다.

{
"Lists1": [{"point":"a","coordinates":[2289.48096,2093.48096]},{"point":"c","coordinates":[2289.48096,2093.48096]}]
}
{
"Lists2": [{"point":"b","coordinates":[2289.48096,2093.48096]},{"point":"d","coordinates":[2289.48096,2093.48096]}]
}

두 키를 모두 동일한 객체에 두시겠습니까?

jq -s '
    [ (.[0] | keys[]) as $k |
      reduce .[] as $item (null; .[$k] += $item[$k]) ] | add' file*.json

답변2

열쇠라면아니요문서 전체에서 항상 동일하며 다음과 같은 작업이 수행됩니다.

jq --slurp '
    reduce (.[] | to_entries | .[]) as {$key, $value} (
        {};
        .[$k] += $v
    )
    ' file*.json

다음 두 파일이 주어지면:

{
    "Lists1": [{"point":"a","coordinates":"..."],
    "Lists2": [{"point":"b","coordinates":"..."}]
}
{
    "Lists1": [{"point":"c","coordinates":"..."}],
    "Lists2": [{"point":"d","coordinates":"..."}],
    "Lists3": [{"point":"e","coordinates":"..."}]
}

출력은 다음과 같습니다

{
    "Lists1":[{"point":"a","coordinates":"..."},{"point":"c","coordinates":"..."}],
    "Lists2":[{"point":"b","coordinates":"..."},{"point":"d","coordinates":"..."}],
    "Lists3":[{"point":"e","coordinates":"..."}]
}

관련 정보