jq를 사용하여 필드와 중첩 필드를 동시에 가져오기

jq를 사용하여 필드와 중첩 필드를 동시에 가져오기

JIRA API에서 필요한 두 가지 속성을 얻으려고 합니다. JQ에 다음 입력이 주어졌습니다.

{
  "expand": "names,schema",
  "startAt": 0,
  "maxResults": 50,
  "total": 1,
  "issues": [
    {
      "expand": "operations,versionedRepresentations,editmeta,changelog,renderedFields",
      "id": "73270",
      "key": "RM-111",
      "fields": {
        "statuscategorychangedate": "2020-09-29T15:12:18.837+0100",
        "lastViewed": "2020-09-30T09:25:38.846+0100",
        "summary": "6.6.0"
      }
    }
  ]
}

다음 출력을 얻고 싶습니다.

RM-111 6.6.0

개별적으로 얻을 수 있습니다.

> cat rm111.json | jq -r '.issues[] | .key'
RM-111

> cat rm111.json | jq -r '.issues[] | .fields.summary'
6.6.0

새 줄로 구분할 수 있습니다.

> cat rm111.json | jq -r '.issues[] | .key,.fields.summary'
RM-111
6.6.0

그러나 다음(실제로 필요한 형식을 제공해야 함)은 작동하지 않으며 그 이유를 이해할 수 없습니다.

> cat rm111.json | jq -r '.issues[] | .key .fields.summary'
jq: error (at <stdin>:18): Cannot index string with string "fields"

이 예에 표시된 것보다 더 많은 문제가 있을 수 있으므로 문제[]를 반복해야 합니다.

답변1

탭으로 구분된 값 목록: 각 값에 필요한 값의 배열을 생성 issue[]하고 에 전달합니다 @tsv.

$ jq -r '.issues[] | [ .key, .fields.summary ] | @tsv' file.json
RM-111  6.6.0

공백으로 구분된 두 값의 문자열: 각 값에 대해 큰따옴표로 묶인 문자열이 생성되고 문자열에 값을 삽입 issue[]하는 데 사용됩니다 .\(...)

$ jq -r '.issues[] | "\(.key) \(.fields.summary)"' file.json
RM-111 6.6.0

마지막 두 명령의 문제점은 첫 번째 명령이 먼저 나온 .key다음 .fields.summary. 이 두 데이터 조각은 별도의 라인에 출력됩니다.

마지막 명령은 .key.fields.summary존재하지 않는 명령을 추출하려고 시도합니다.

관련 정보