jq를 사용하여 json에서 객체 배열 필터링

jq를 사용하여 json에서 객체 배열 필터링

jq와 최종 예상 출력을 사용하여 다음 json 데이터를 채우려고 합니다.

cat data.json

{
    "params": {
        "filters": {},
        "group_by": [
            "service"
        ],
        "metrics": [
            "cocekop:count",
            "cocekop.seconds_to_first_ack:avg",
            "cocekop.seconds_to_resolve:avg",
            "cocekop.escalated:count"
        ],
        "since": "2022-03-01T15:00:00.000Z",
        "time_zone": "Asia/Tokyo",
        "until": "2022-03-02T14:59:59.000Z"
    },
    "report": {
        "groups": [
            [{
                    "id": "PKOLSA",
                    "name": "Commuincation"
                },
                {
                    "id": "PRKOLS",
                    "name": "Designation"
                },
                {
                    "id": "PKDFKDL",
                    "name": "Mapping"
                }
            ]
        ],
        "metrics": {
            "cocekop.escalated:count": [
                1,
                0,
                0
            ],
            "cocekop.seconds_to_first_ack:avg": [
                86,
                0,
                9
            ],
            "cocekop.seconds_to_resolve:avg": [
                8161,
                492,
                301
            ],
            "cocekop:count": [
                1,
                1,
                0
            ]
        }
    }
}

출력이 될 것으로 예상합니다.

id,name,cocekop:count
PKOLSA,Commuincation,1
PRKOLS,Designation,1
PKDFKDL,Mapping,0

도와주세요.

답변1

jq -r --arg metric "cocekop:count" '
[ "id", "name", $metric ],
(
        (
                [
                        .report.groups[0][] |
                        [.[]]
                ] |
                transpose
        ) +
        [
                .report.metrics[$metric]
        ] |
        transpose[]
) | @csv' file

또는 재치 있는 말을 좋아한다면:

jq -r --arg metric "cocekop:count" '["id","name",$metric],(([.report.groups[0][]|[.[]]]|transpose)+[.report.metrics[$metric]]|transpose[])|@csv' file

질문에 입력된 내용을 고려하면 결과는 다음과 같습니다.

"id","name","cocekop:count"
"PKOLSA","Commuincation",1
"PRKOLS","Designation",1
"PKDFKDL","Mapping",0

첫 번째는 transpose입력에서 다음과 같은 중간 결과를 생성합니다.

[
  [
    "PKOLSA",
    "PRKOLS",
    "PKDFKDL"
  ],
  [
    "Commuincation",
    "Designation",
    "Mapping"
  ]
]

이를 위해 사용자 제공 변수를 사용하여 $metric선택한 지표 데이터를 추가하여 다음을 제공합니다.

[
  [
    "PKOLSA",
    "PRKOLS",
    "PKDFKDL"
  ],
  [
    "Commuincation",
    "Designation",
    "Mapping"
  ],
  [
    1,
    1,
    0
  ]
]

두 번째는 transpose열 배열을 행 배열로 변환하여 @csv데이터를 CSV 형식으로 출력합니다. 제목은 jq표현식의 첫 번째 줄에 의해 생성됩니다.

관련 정보