
다음과 같은 JSON이 있다고 가정해 보겠습니다.
{
"key1": {
"keyA": "1",
"keyB": "null",
"keyC": "null"
},
"key2": {
"keyA": "null",
"keyB": "3",
"keyC": "null"
}
}
null
내 JSON의 값이 있는 모든 키를 제외하는 방법을 찾고 싶습니다 . 따라서 결과는 다음과 같습니다.
{
"key1": {
"keyA": "1"
},
"key2": {
"keyB": "3"
}
}
jq
예를 들어 를 사용하여 이름이 있는 특정 키를 제외할 수 있다는 것을 알고 있습니다 . cat myjson.json | jq 'del(.[]|.keyA)'
이렇게 하면 json 내의 모든 키가 지워지지만 해당 값에 따라 키를 제외하고 싶습니다. 을 사용하여 keyA
값이 있는 모든 키를 어떻게 제외할 수 있습니까 ?"null"
jq
답변1
del(..|select(. == "null"))
이는재귀하강 연산자..
그리고select
기능와 같은 값을 가진 객체의 모든 위치를 찾아서 "null"
에 제공합니다 del
. select
특정 값을 포함할지 여부를 결정하기 위해 부울 표현식을 평가하는 동시에 ..
트리의 모든 단일 값을 여기에 제공하고 del
위치를 생성하는 표현식을 허용합니다. (데모)
path
이 함수를 사용하여 찾은 내용을 확인할 수 있습니다.
path(..|select(. == "null"))
먼저 삭제하려고 한다고 생각되는 항목을 디버그하세요. 그만큼산출값에 도달하기 위해 재귀적으로 따라야 하는 키 배열이므로 배열의 마지막 항목은 실제로 삭제될 키입니다.
|= empty
jq 1.6 이상에서는 업데이트 할당을 사용할 수도 있습니다 (이전 버전에서는 자동으로 실패함). 이 내용이 더 명확할 수도 있고 그렇지 않을 수도 있습니다 (..|select(. == "null")) |= empty
.데모) 동일한 키를 삭제합니다.
값이 null
string 대신 true 이면 전체 대신 내장 함수를 사용할 "null"
수 있습니다 .nulls
select
del(..|nulls)
값이 true인 경우 null입니다.그리고당신은 사용하고jq 1.5recurse(.[]?; true)
(많은 배포판의 현재 버전) 대신에 를 사용해야 합니다 ..
. 이는 null 값이 특별히 제외되기 때문입니다 ..
.그것은 다음과 같이 정의됩니다recurse
, 어느다음과 같이 정의됩니다. recurse(.[]?)
, 이는 )으로 정의됩니다 recurse(.[]?; . != null)
. 이 동작은 1.6에서 위의 (더 유용한) 동작으로 변경되었습니다.문서변하지 않았어, 뭐.문서 버그인 것 같습니다.
답변2
두 번째 수준에서 값을 테스트하고 싶다고 가정합니다.
jq 'del(.[][] | select(. == "null"))' file
그러면 맨 위에서 두 번째 수준에 있는 모든 키-값 쌍이 삭제됩니다. 여기서 값은 리터럴 string 입니다 null
.
문제의 문서가 주어지면 예상되는 출력이 생성됩니다.
1.5보다 최신 버전을 사용하면 jq
값이 없는 비트로 데이터를 업데이트할 수도 있습니다 null
.
jq '.[][] |= select(. != "null")' file