![jq - 파일의 객체를 json 배열에 추가](https://linux55.com/image/138273/jq%20-%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EA%B0%9D%EC%B2%B4%EB%A5%BC%20json%20%EB%B0%B0%EC%97%B4%EC%97%90%20%EC%B6%94%EA%B0%80.png)
jq를 사용하여 기존 json 파일에 요소와 값이 포함된 배열을 추가하고 싶습니다.
이미 파일(input.json)이 있습니다.
{
"id": 9,
"version": 0,
"lastUpdTs": 1532371267968,
"name": "Training"
}
이 json(orig.json)의 다른 그룹 배열에 추가하고 싶습니다.
[
{
"name": "JAYS",
"sourceConnection": {
"name": "ORACLE_connection",
"connectionType": "JDBC",
"commProtocol": "JDBC"
},
"checked": true,
"newlyAdded": false,
"id": null,
"groups": [],
"displayName": "SCOTT",
"defaultLevel": "MANAGED"
}
]
최종 결과는 다음과 같아야합니다
[
{
"name": "JAYS",
"sourceConnection": {
"name": "ORACLE_connection",
"connectionType": "JDBC",
"commProtocol": "JDBC"
},
"checked": true,
"newlyAdded": false,
"id": null,
"groups": [
{
"id": 9,
"version": 0,
"lastUpdTs": 1532371267968,
"name": "Training"
}
],
"displayName": "SCOTT",
"defaultLevel": "MANAGED"
}
]
배열에 요소를 추가하는 방법을 알고 있지만 파일에서 요소를 전달하는 방법은 잘 모르겠습니다.
jq '.[].groups += [{"INPUT": "HERE"}]' ./orig.json
답변1
jq
--argjson
해당 플래그를 사용하여 실제 JSON 콘텐츠를 제공하기 위한 플래그가 있습니다 . 당신이 해야 할 일은 첫 번째 JSON 파일의 내용을 jq
컨텍스트의 변수에 저장하고 두 번째 JSON에서 업데이트하는 것입니다.
jq --argjson groupInfo "$(<input.json)" '.[].groups += [$groupInfo]' orig.json
이 부분은 "$(<input.json)"
주어진 파일의 내용을 출력하고 --argjson
해당 인수를 변수에 저장하는 쉘 리디렉션 구성입니다 groupInfo
. 이제 groups
실제 필터 섹션의 배열 에 추가합니다 .
즉, 위의 솔루션은 다음을 수행하는 것과 동일합니다.
jq --argjson groupInfo '{"id": 9,"version": 0,"lastUpdTs": 1532371267968,"name": "Training" }' \
'.[].groups += [$groupInfo]' orig.json
답변2
이게 정확한 상황이에요input
기능사용:
input
input[...]은 jq 자체와 동일한 소스(예: 명령줄에 이름이 지정된 파일인 stdin)에서 읽습니다. 이 두 가지 내장 함수와 jq 자체 읽기 작업은 인터리브될 수 있습니다.
즉, jq
파일에서 객체/값을 읽고 이에 대해 파이프를 수행합니다 input
.다음입력을 읽어서 함수의 결과로 사용합니다.
이는 다음을 수행할 수 있음을 의미합니다.
jq '.[].groups += [input]' orig.json input.json
이미 작성한 명령과 정확히 동일한 명령에 input
값을 더한 것입니다. 표현식 input
은 인수 목록의 다음 파일에서 읽은 (첫 번째) 객체로 평가됩니다(이 경우 ) input.json
.
당신이 가지고 있다면많은 종류의inputs
대신 동일한 의미로 삽입할 항목을 사용할 수 있습니다 . 이는 명령줄에서 단일 또는 여러 파일에 동일하게 적용되며 [inputs]
모든 파일 본문을 배열로 나타냅니다.
여러 파일을 인터리브하여 각 파일에 동반 파일을 삽입하는 것도 가능 orig
하지만 출력을 분할하는 것은 번거롭습니다.
답변3
새 버전 jq
지원slurpfile
이렇게 하면 원하는 결과를 얻을 수 있습니다.jq '.[].groups += $inputs' orig.json --slurpfile inputs input.json
jq 1.6에서 테스트되었습니다.
답변4
점을 자리 표시자로 사용
echo '{
"id": 9,
"version": 0,
"lastUpdTs": 1532371267968,
"name": "Training"
}' | jq '[
{
"name": "JAYS",
"sourceConnection": {
"name": "ORACLE_connection",
"connectionType": "JDBC",
"commProtocol": "JDBC"
},
"checked": true,
"newlyAdded": false,
"id": null,
"groups": [.],
"displayName": "SCOTT",
"defaultLevel": "MANAGED"
}
]'
산출:
[
{
"name": "JAYS",
"sourceConnection": {
"name": "ORACLE_connection",
"connectionType": "JDBC",
"commProtocol": "JDBC"
},
"checked": true,
"newlyAdded": false,
"id": null,
"groups": [
{
"id": 9,
"version": 0,
"lastUpdTs": 1532371267968,
"name": "Training"
}
],
"displayName": "SCOTT",
"defaultLevel": "MANAGED"
}
]
jq --version
jq-1.6