여러 json 파일을 공통 객체로 병합하여 하나로 결합

여러 json 파일을 공통 객체로 병합하여 하나로 결합

다음 형식의 json 파일이 많이 있습니다.

샘플 file1:

{
  "attributes": [
    {
      "name": "Node",
      "value": "test"
    }
  ]
}

샘플 file2:

{
  "attributes": [
    {
      "name": "version",
      "value": "11.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배열이므로). 따라서 tomlqJSON으로 다시 변환하면 올바른 작업이 수행됩니다.


이 유틸리티를 사용하여 동등한 변환을 수행할 수 있습니다 yj(https://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.

관련 정보