매개변수가 있는 JQ를 사용하여 여러 json 파일을 하나의 객체로 결합

매개변수가 있는 JQ를 사용하여 여러 json 파일을 하나의 객체로 결합

수천 개의 JSON 파일이 있고 이를 하나의 개체로 병합하고 싶습니다. 유사한 형식이 아닙니다. 자세히 설명하겠습니다. JSON의 첫 번째 예입니다.

[
  {
    "value 1": 1,
    "value 2": 2,
    "value 3": 3,
    "value 4": 4
  }
]

다른 유형과 유사하지 않습니다. 아래와 같이 공개 필드 및 기타 필드가 거의 없습니다.

[
  {
    "value 3": 300,
    "value 4": 400,
    "value 5": 500,
    "value 6": 600
  }
]

예를 들어 첫 번째 예제 형식의 파일 2개와 두 번째 예제 형식의 파일 1개가 있습니다. jq병합 하려고 합니다 .

jq -s '.' *.json > myfile.json

세 가지 다른 객체를 사용하여 다음을 반환합니다.

[
  {
    "value 1": 1,
    "value 2": 2,
    "value 3": 3,
    "value 4": 4
  }
],
[
  {
    "value 1": 10,
    "value 2": 20,
    "value 3": 30,
    "value 4": 40
  }
],
[
  {
    "value 3": 300,
    "value 4": 400,
    "value 5": 500,
    "value 6": 600
  }
]

아래와 같이 하나의 개체로 병합해야 하며 jq특정 필드가 있는 해당 파일을 제외할 수 있는 옵션이 있습니까? 예를 들어 이 필드가 있는 파일을 제외합니다 "value 6". 따라서 최종 JSON 출력은 다음과 같습니다.

[
  {
    "value 1": 1,
    "value 2": 2,
    "value 3": 3,
    "value 4": 4
  },
  {
    "value 1": 10,
    "value 2": 20,
    "value 3": 30,
    "value 4": 40
  }
]

답변1

inputs모든 JSON 파일의 콘텐츠에 필터를 적용하고 선택 필터를 함께 적용할 수 있습니다 . 이 -n플래그는 지정된 입력을 기반으로 출력 JSON이 처음부터 작성되었는지 확인하는 데 사용됩니다.

jq -n '[ inputs[] | select( has("value 6") | not ) ]' *.json

이렇게 하면 jq -n 'inputs[]'JSON 파일을 구성하는 모든 개체를 select 함수에 사용할 수 있으며, 이 함수는 키 필드가 포함된 모든 개체를 삭제합니다 "value 6". [..]필터 주위에는 배열의 최종 결과 개체가 배치됩니다 .

reduce()또 다른 방법은 함수를 사용하여 필요한 개체를 반복적으로 추가하는 것입니다.

jq -n 'reduce inputs[] as $data (.; . + [ if $data | has("value 6") | not then $data else empty end ] )'

답변2

중첩된 json 파일을 로컬에서 병합하기 위해 Node.js를 사용하여 명령줄 도구를 만들었습니다.

https://github.com/divyeshmakwana96/injson

!include('./path-to-json/item1.json')명령문을 사용하여 다른 json 파일의 내용을 포함 할 수 있습니다 . 하위 json 파일에는 include 문도 있을 수 있습니다.

예:

{
  "pi": 3.141,
  "happy": true,
  "questions:": [
    "!include('./questions/item1.json')",
    "!include('./questions/item2.json')"
  ],
  "answer": "!include('./answers/item1.json')"
}

관련 정보