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
  ]
]

2番目は、transpose列配列を行配列に変換して@csvデータをCSV形式で出力します。タイトルはjq式の最初の行によって生成されます。

おすすめ記事