각 jq 출력에 번호를 매깁니다.

각 jq 출력에 번호를 매깁니다.

JSON 파일이 있습니다

{
    "fieldA": {"fieldData": "XYZ"}
    "fieldB": {"fieldData": "PQR"}
    "fieldC": {"fieldData": null}
    "fieldD": {"fieldData": "DEF"}

나는 사용했다jq

jq -r 'to_entries[] | if .value.fieldData != null then .key, .value.fieldData else empty end'

다음과 같이 데이터를 인쇄합니다.

fieldA
XYZ
fieldB
PQR
fieldD
DEF

이제 이를 사용하여 인덱스를 가져오고 싶지만 null 값은 무시합니다.

1
fieldA
XYZ
2
fieldB
PQR
# see the 3rd field is ignored completely and 3 is given for the 4th field.
3
fieldD
DEF

답변1

입력 JSON 문서가 유효하고 다음과 같다고 가정합니다.

{
   "fieldA": { "fieldData": "XYZ" },
   "fieldB": { "fieldData": "PQR" },
   "fieldC": { "fieldData": null },
   "fieldD": { "fieldData": "DEF" }
}

jq그런 다음 값이 다음과 같은 부분을 제거하여 표현식을 시작할 수 있습니다 .fieldDatanull

jq 'map_values(select(.fieldData != null))' file

결과 개체의 각 키 인덱스에 액세스하려면 다음을 사용할 수 있습니다.to_entries 두 배그리고 관심 있는 다른 데이터와 함께 이를 추출합니다.

$ jq -r 'map_values(select(.fieldData != null)) | to_entries | to_entries | map(.key+1, .value.key, .value.value.fieldData)[]' file
1
fieldA
XYZ
2
fieldB
PQR
3
fieldD
DEF

to_entries원본 객체의 키 인덱스에 액세스하기 위해 이를 두 번 사용합니다 .

JSON 객체의 키 순서가 반드시 고정되어 있는 것은 아닙니다. JSON 구조에서 고정된 순서가 필요한 경우 대신 배열을 사용하세요. 어쩌면 좋아

[
    { "name": "fieldA", "fieldData": "XYZ" },
    { "name": "fieldB", "fieldData": "PQR" },
    { "name": "fieldC", "fieldData": null },
    { "name": "fieldD", "fieldData": "DEF" }
]

이전 관련 질문의 원본 데이터 사용(검사를 통해 배열의 json에서 키와 값을 가져옵니다.):

jq -r 'map(select(.name != "null")) | to_entries | map(.key+1, .value.name, .value.type)[]'  file

또는

jq -r 'map(select(.name != "null") | [.name, .type]) | to_entries | map(.key+1, .value[])[]'  file

이것은 다른 질문에 대한 내 대답에 약간 더 가깝습니다.

to_entries현재는 호출이 없기 때문에 위와 비교하여 초기 호출이 누락되었습니다.키의 데이터따라서 키 자체를 조사할 필요가 없습니다.

관련 정보