jq - 다중인 경우

jq - 다중인 경우

입력 JSON 파일:

[
  {
    "id": "1e9b2215-9efd-67cc-9113-1e21c74f09d3",
    "login": "u0159",
    "name": "Pat ABC",
    "role": "User",
    "groups": null,
    "disabled": false,
    "lLoginTime": 1567158950468,
    "lLoginFrom": "192.168.100.11"
  },
  {
    "id": "1e9b2215-9efd-67cc-9113-2b21c74f09d3",
    "login": "u0154",
    "name": "Roman ABC",
    "role": "User",
    "groups": [
      {
        "id": "1e8dc82a-596f-623c-8bc5-100000000000",
        "name": "Default ABC"
      },
      {
        "id": "1e99833f-9876-65d0-9d24-237228b9d9e0",
        "name": "AGE"
      }
    ],
    "disabled": false,
    "lLoginTime": 1567158950468,
    "lLoginFrom": "192.168.100.11"
  },
  {
    "id": "1e9b2215-9c2b-64f4-a0f1-47abdab7ae5f",
    "login": "u0155",
    "name": "Tomas CDE",
    "role": "User",
    "groups": [
      {
        "id": "1e8dc82a-596f-623c-8bc5-100000000000",
        "name": "ZZZ"
      },
      {
        "id": "1e8dc82a-596f-623c-8bc5-100000000000",
        "name": "Default ABC"
      },
      {
        "id": "1e99234f-9876-65d0-9d24-534528b9d9e0",
        "name": "NTE"
      }
    ],
    "disabled": false,
    "lLoginTime": 1566302653093,
    "lLoginFrom": "192.168.100.16"
  }
]

다음 필터를 확장하고 싶습니다.

$ jq -r '.[]|[.id, .login, ( if .groups == null then "n/a" else ([.groups[].name]|join("|")) end )]|@tsv' /tmp/test__
1e9b2215-9efd-67cc-9113-1e21c74f09d3    u0159   n/a
1e9b2215-9efd-67cc-9113-2b21c74f09d3    u0154   Default ABC|AGE
1e9b2215-9c2b-64f4-a0f1-47abdab7ae5f    u0155   ZZZ|Default ABC|NTE

|로 구분된 그룹 목록에서 모든 "기본 ABC" 출력을 제거하는 경우

Appended if를 사용해 보았지만 오류로 인해 실패했습니다.

$ jq -r '.[]|[.id, .login, ( if .groups == null then "n/a" else ( if .groups[].name != "Default ABC" then [.groups[].name]|join("|")) end ) end )]|@tsv' /tmp/test__
jq: error: syntax error, unexpected ')' (Unix shell quoting issues?) at <top-level>, line 1:

어떤 조언이라도 감사드립니다...

샘플 json의 예상 출력은 다음과 같습니다.

1e9b2215-9efd-67cc-9113-1e21c74f09d3    u0159   n/a
1e9b2215-9efd-67cc-9113-2b21c74f09d3    u0154   AGE
1e9b2215-9c2b-64f4-a0f1-47abdab7ae5f    u0155   ZZZ|NTE

업데이트: oliv에서 제공하는 솔루션:

$ jq -r '.[]|[.id,.login,if .groups then (.groups|map(select(.name != "Default ABC").name)|join("|")) else "n/a" end]|@tsv' /tmp/test__
1e9b2215-9efd-67cc-9113-1e21c74f09d3    u0159   n/a
1e9b2215-9efd-67cc-9113-2b21c74f09d3    u0154   AGE
1e9b2215-9c2b-64f4-a0f1-47abdab7ae5f    u0155   ZZZ|NTE

답변1

그것이 존재한다면 배열이라고 가정하고 다음을 groups사용하여 원하지 않는 항목을 필터링할 수 있습니다.nameselect

<file jq -r '.[]|[.id,.login,if .groups then (.groups|map(select(.name != "Default ABC").name)|join("|")) else "n/a" end]|@tsv'

관련 정보