jq - 한 줄에 값을 인쇄합니다.

jq - 한 줄에 값을 인쇄합니다.

JSON 입력:

[
  {
    "name": "cust1",
    "grp": [
      {
        "id": "46",
        "name": "BA2"
      },
      {
        "id": "36",
        "name": "GA1"
      },
      {
        "id": "47",
        "name": "NA1"
      },
      {
        "id": "37",
        "name": "TR3"
      },
      {
        "id": "38",
        "name": "TS1"
      }
    ]
  }
]

예상되는 출력은 두 줄입니다.

name: cust1
groups: BA2 GA1 NA1 TR3 TS1

필터를 구축하려고 시도했지만 성공하지 못했습니다.

$ jq -r '.[]|"name:", .name, "groups:", (.grp[]|[.name]|@tsv)' test_json
name:
cust1
groups:
BA2
GA1
NA1
TR3
TS1

업데이트: 아래 제공된 솔루션은 제대로 작동하지만 그룹이 존재하지 않을 때 어떤 일이 발생할지 예측할 수 없습니다.

[
  {
    "name": "cust1",
    "grp": null
  }
]

이 경우 제공된 솔루션은 오류를 반환합니다.

$ jq -jr '.[]|"name:", " ",.name, "\n","groups:", (.grp[]|" ",.name),"\n"' test_json2
name: cust1
jq: error (at test_json2:6): Cannot iterate over null (null)

어떤 해결 방법이라도 감사하겠습니다.

답변1

"가입"을 사용하세요.-j

$ jq -jr '.[]|"name:", " ",.name, "\n","groups:", (.grp[]|" ",.name),"\n"' test_json
name: cust1
groups: BA2 GA1 NA1 TR3 TS1

자리 표시자 포함

$ jq -jr '.[]|"name:", " ",.name, "\n","groups:", (.grp//[{"name":"-"}]|.[]|" ",.name),"\n"' test_json
name: cust1
groups: -

답변2

$ jq -r '.[] |
      [ "name:", .name ], [ "groups:", .grp[].name ]
      | @tsv' file.json
name:   cust1
groups: BA2     GA1     NA1     TR3     TS1

즉, @tsv두 개의 배열이 주어지며, 하나는 이름을 포함하고 다른 하나는 그룹을 포함합니다. 각 배열은 자체 행이 됩니다.

grp배열이 비어 있을 수 있고 하나를 삽입하려는 경우 -:

$ jq -r '.[] |
      [ "name:", .name ], [ "groups:", (.grp // [])[].name // "-" ]
      | @tsv' file.json
name:   cust1
groups: -

연산은 OR로 평가되지 않는 한 x // y반환되며 , OR로 평가되는 경우 반환됩니다.xxnullfalsey

grp이는 빈 배열뿐만 아니라 완전히 누락된 사례도 처리합니다 .

관련 정보