다음 형식의 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
배열이므로). 따라서 tomlq
JSON으로 다시 변환하면 올바른 작업이 수행됩니다.
이 유틸리티를 사용하여 동등한 변환을 수행할 수 있습니다 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 -jc
및 yj -cj
대신 yj -jt
및 를 사용하여 Hashicorp의 HCL 형식을 통해 동일한 유형의 왕복을 수행할 수도 있습니다 yj -tj
.