쿼리를 사용하여 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 // 0.0.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

관련 정보