![jq 또는 다른 도구를 사용하여 json 파일을 병합하는 방법은 무엇입니까?](https://linux55.com/image/140856/jq%20%EB%98%90%EB%8A%94%20%EB%8B%A4%EB%A5%B8%20%EB%8F%84%EA%B5%AC%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20json%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EB%B3%91%ED%95%A9%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
질문을 좀 더 구체적으로 수정하세요. 2개의 JSON 파일이 있으며, 그 중 첫 번째 파일에는 몇 개의 청크만 있습니다. 보시다시피 두 번째에는 블록이 거의 없고 리디렉션 규칙도 거의 추가되지 않습니다.
"values": [
"/businessclass/articles/money.page",
"/businessclass/articles/1.page",
"/businessclass/articles/2.page"
],
출력은 두 파일의 병합이어야 합니다. json 파일 1에 대한 변경 사항과 Json 2에 대한 업데이트된 리디렉션 규칙이 포함됩니다.
JSON 파일 1
[
{
"name": "caching",
"options": {
"behavior": "MAX_AGE",
"mustRevalidate": false,
"ttl": "10m",
"defaultTtl": "30m"
}
},
{
"name": "/businessclass/articles/money.page",
"children": [],
"behaviors": [
{
"name": "redirect",
"options": {
"destinationPathOther": "/businessclass/articles/finance-and-operations.page"
}
}
],
"criteria": [
{
"name": "path",
"options": {
"matchOperator": "MATCHES_ONE_OF",
"values": [
"/businessclass/articles/money.page"
],
"matchCaseSensitive": false
}
}
],
"criteriaMustSatisfy": "all",
"comments": ""
}
]
JSON 파일 2
{
"name": "/businessclass/articles/money.page",
"children": [],
"behaviors": [
{
"name": "redirect",
"options": {
"destinationPathOther": "/businessclass/articles/finance-and-operations.page"
}
}
],
"criteria": [
{
"name": "path",
"options": {
"matchOperator": "MATCHES_ONE_OF",
"values": [
"/businessclass/articles/money.page",
"/businessclass/articles/1.page",
"/businessclass/articles/2.page"
],
"matchCaseSensitive": false
}
}
],
"criteriaMustSatisfy": "all",
"comments": ""
}
예상 출력
[
{
"name": "caching",
"options": {
"behavior": "MAX_AGE",
"mustRevalidate": false,
"ttl": "10m",
"defaultTtl": "30m"
}
},
{
"name": "/businessclass/articles/money.page",
"children": [],
"behaviors": [
{
"name": "redirect",
"options": {
"destinationPathOther": "/businessclass/articles/finance-and-operations.page"
}
}
],
"criteria": [
{
"name": "path",
"options": {
"matchOperator": "MATCHES_ONE_OF",
"values": [
"/businessclass/articles/money.page",
"/businessclass/articles/1.page",
"/businessclass/articles/2.page"
],
"matchCaseSensitive": false
}
}
],
"criteriaMustSatisfy": "all",
"comments": ""
}
]
훌륭한. 규칙의 순서는 변경될 수 있습니다. 또한 때로는 새 이름을 가진 새 규칙을 json 파일에 추가할 수 있습니다(예: "name": "/businessclass/articles/money.page"). 따라서 어떤 변경 사항이 발생하더라도 델타를 찾아야 하며 이에 따라 파일을 병합해야 합니다. 또는 병합된 변경 사항도 포함하는 새 json 파일을 생성할 수 있습니다.
답변1
귀하의 질문을 올바르게 이해했다면 각 파일의 개체가 포함된 배열을 출력하고 싶을 것입니다. 이 경우에는 -s
이미 이 작업을 수행했으므로 다음 작업만 수행하면 됩니다.
jq -s . file1 file2
추가 변환이 필요한 경우 질문을 편집하고 필요한 내용에 대한 간단한 요약을 제공하십시오(예상 결과를 실제 출력과 한 줄씩 비교하지 않았습니다).
편집하다
필요한 변환의 일반적인 특성에 대해서는 아직 잘 모르겠지만 형식이 예제와 정확히 같고 원하는 것은 values
첫 번째 파일의 필드를 values
두 번째 파일의 필드 내용 으로 바꾸는 것뿐입니다. 다른 사람들은 모두 유지하고 시도해 보세요.
jq -s '.[0][1].criteria[0].options.values=.[1].criteria[0].options.values' file1 file2
여기서 파일은 첫 번째 파일과 두 번째 파일 과 마찬가지로 -s
배열로 반환됩니다 . 그런 다음 정적 경로만 선택하고 일치하는 단일 필드를 먼저 업데이트합니다..[0]
.[1]
개체의 순서나 개수가 가변적이거나 일치하는 개체에서만 교체가 작동하는 경우 질문을 업데이트하세요.
답변2
내가 가장 좋아하는 JSON 및 YAML 병합 도구는 다음과 같습니다.가문비. 출력 JSON을 가져오는 명령은 다음과 같습니다.
spruce merge file1.json file2.json | spruce json
답변3
.name
첫 번째 JSON 파일 배열의 키와 두 번째 파일의 키를 기반으로 .name
두 파일 간의 관계형 JOIN 작업을 수행합니다 .
.name
동일한 값을 갖는 요소 의 경우 두 번째 파일에서 요소가 선택되고, 그렇지 않으면 첫 번째 파일에서 요소가 선택됩니다.
jq -s '[ JOIN(INDEX(.[1]; .name); .[0][]; .name; .[1] // .[0]) ]' file1 file2
.name
비슷한 방식으로 두 번째 파일과 동일한 값을 가진 키를 가진 첫 번째 파일의 배열 항목을 모두 선택합니다. 두 번째 파일의 데이터로 이러한 항목을 업데이트합니다.
jq -s '[ .[1] as $u | .[0][] | select(.name == $u.name) |= $u ]' file1 file2
두 변형 모두(첫 번째 명령의 끝 부분 제외)에서 .[0]
첫 번째 파일(배열)의 데이터이지만 두 번째 파일(단일 개체)의 데이터 .[1]
는 아닙니다 . 질문에 표시된 입력이 주어지면 두 명령 모두 예상된 출력을 생성합니다.