jq를 사용하여 JSON 내에서 특정 값을 가진 모든 키를 어떻게 제외할 수 있나요?

jq를 사용하여 JSON 내에서 특정 값을 가진 모든 키를 어떻게 제외할 수 있나요?

다음과 같은 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"))

먼저 삭제하려고 한다고 생각되는 항목을 디버그하세요. 그만큼산출값에 도달하기 위해 재귀적으로 따라야 하는 키 배열이므로 배열의 마지막 항목은 실제로 삭제될 키입니다.

|= emptyjq 1.6 이상에서는 업데이트 할당을 사용할 수도 있습니다 (이전 버전에서는 자동으로 실패함). 이 내용이 더 명확할 수도 있고 그렇지 않을 수도 있습니다 (..|select(. == "null")) |= empty.데모) 동일한 키를 삭제합니다.


값이 nullstring 대신 true 이면 전체 대신 내장 함수를 사용할 "null"수 있습니다 .nullsselectdel(..|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

관련 정보