クエリを使用してjsonファイルの隣接値を印刷する

クエリを使用してjsonファイルの隣接値を印刷する

次のjsonファイルがあります

    {
  "total": 64,
  "p": 1,
  "ps": 1,
  "paging": {
    "pageIndex": 1,
    "pageSize": 1,
    "total": 64
  },
  "effortTotal": 216,
  "issues": [
    {
      "key": "AX8lZNY1h5xTw2fmJuX6",
      "rule": "xml:S125",
      "severity": "MAJOR",
      "component": "X8lXT9yjCYHsI0QujFF:pom.xml",
      "project": "X8lXT9yjCYHsI0QujFF",
      "line": 29,
      "hash": "6e7405674b46c05cd7d7fc9433dbb323",
      "textRange": {
        "startLine": 29,
        "endLine": 33,
        "startOffset": 6,
        "endOffset": 22
      },
      "flows": [],
      "status": "OPEN",
      "message": "Remove this commented out code.",
      "effort": "5min",
      "debt": "5min",
      "author": "[email protected]",
      "tags": [
        "unused"
      ],
      "creationDate": "2021-12-19T18:54:28+0100",
      "updateDate": "2022-02-23T08:03:15+0100",
      "type": "CODE_SMELL",
      "scope": "MAIN"
    }
  ],
  "components": [
    {
      "key": "X8lXT9yjCYHsI0QujFF:pom.xml",
      "enabled": true,
      "qualifier": "FIL",
      "name": "pom.xml",
      "longName": "pom.xml",
      "path": "pom.xml"
    },
    {
      "key": "X8lXT9yjCYHsI0QujFF",
      "enabled": true,
      "qualifier": "TRK",
      "name": "my-app",
      "longName": "my-app"
    }
  ],
  "facets": [
    {
      "property": "types",
      "values": [
        {
          "val": "BUG",
          "count": 34
        },
        {
          "val": "CODE_SMELL",
          "count": 30
        },
        {
          "val": "VULNERABILITY",
          "count": 0
        }
      ]
    }
  ]
}

以下のように値を印刷したいと思います。

BUG=34

以下の回避策を試しましたが、要件に従って印刷されませんでした。

jq -r '.facets[].values[0].val,.facets[].values[0].count' file.json

次のように印刷してください

BUG
34

しかし、[0]のBUG、[1]のCODE_SMELLなどをもう一度言及する必要があります。

次のように印刷する方法はありますか?

BUG=34
CODE_SMELL:30
VULNERABILITY:0 (it will be null but I can put condition to print it is as zero in shell script while referring it as variable)

ご案内ください。私はJQを初めて使用します。 sedを使用して行う方法はわかっていますが、スクリプトに追加するにはより多くの手順が必要です。

答え1

配列の各要素から合計値を抽出して、val次の文字列形式で指定できます。countvaluesfacetskey=value

jq -r '.facets[].values[] | "\(.val)=\(.count // 0 | @sh)"' file

この@sh演算子は、文字列が文字列を引用し、潜在的に問題のある文字をエスケープして、変数の割り当てとしてシェルで実行するのに適した型であることを確認します。

これにより、または欠落している場合は値が使用されます.count // 00.countnullfalse

上記の文書が与えられた場合、このコマンドは以下を生成します。

BUG=34
CODE_SMELL=30
VULNERABILITY=0

上記のコマンドの出力を評価すると、シェル変数が生成されます。

$ unset -v BUG CODE_SMELL VULNERABILITY  # clears the variables
$ eval "$( jq -r '.facets[].values[] | "\(.val)=\(.count // 0 | @sh)"' file )"
$ echo "$BUG"
34
$ printf '%s\n' "$BUG" "$CODE_SMELL" "$VULNERABILITY"
34
30
0

関連情報