【问题标题】:jq: print "-" for objects which don't have a specific keyjq:为没有特定键的对象打印“-”
【发布时间】:2021-11-25 14:13:17
【问题描述】:

我有以下 json:

[
  {
    "user": "u1",
    "id": "0001"
  },
  {
    "user": "u2",
    "id": "0002",
    "groups": [
      {
        "id": "100001",
        "name": "G1"
      },
      {
        "id": "100002",
        "name": "G2"
      }
    ]
  },
  {
    "user": "u3",
    "id": "0003",
    "groups": [
      {
        "id": "100001",
        "name": "G1"
      }
    ]
  }
]

预期输出是:

u1      0001    -
u2      0002    G1,G2
u3      0003    G1

我有以下 jq 命令:

jq -r 'map(select(.groups[].id)?)| map([.user, .id, ([.groups[].name]|join(","))] | join("\t")) | join("\n")' json

产生:

u2      0002    G1,G2
u2      0002    G1,G2
u3      0003    G1

如何在输出中也包含没有 groups 键的对象并避免如上所示的重复?

【问题讨论】:

  • 您的预期输出中有错字,第一行应该是u1 0001 -

标签: jq


【解决方案1】:

以下jq 应该会给你想要的结果-

jq -r 'def groups(d): if d | length > 0 then d | map(.name) | join(",") else "-" end; map("\(.user)     \(.id)     \(groups(.groups))") | .[]'
u1     0001     -
u2     0002     G1,G2
u3     0003     G1

【讨论】:

  • map([.user, .id, groups(.groups)])[] | @tsv不是字符串插值,而是简洁
猜你喜欢
  • 1970-01-01
  • 2019-01-04
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
  • 2023-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多