如何使用 jq 仅提取 bash 中 json 对象中第一次存在的键/值对

问题描述 投票:0回答:1

任何人都可以帮助我使用

bash
jq
来过滤此 JSON,直到每个项目仅第一次出现
user.login
,并使用最高的
submitted_at
键。端点正在向我返回历史信息,我只想要响应的最新详细信息。以这个 JSON 为例

[
  {
    "user": {
      "login": "user1",
    },
    "state": "CHANGE_REQUESTED",
    "submitted_at": "2024-01-23T19:18:31Z",
  },
  {
    "user": {
      "login": "user1",
    },
    "state": "DISMISSED",
    "submitted_at": "2024-02-05T16:49:58Z",
  },
  {
    "user": {
      "login": "user1",
    },
    "state": "APPROVED"
    "submitted_at": "2024-02-06T19:18:31Z",
  },
  {
    "user": {
      "login": "user2",
    },
    "state": "APPROVED"
    "submitted_at": "2024-01-23T19:18:31Z",
  },
  {
    "user": {
      "login": "user2",
    },
    "state": "DISMISSED"
    "submitted_at": "2024-01-21T19:18:31Z",
  }
]

结果应该是以下 JSON,其中仅包含

user.login
的最新副本,然后我可以循环遍历

[
  {
    "user": {
      "login": "user1",
    },
    "state": "APPROVED"
    "submitted_at": "2024-02-06T19:18:31Z",
  },
  {
    "user": {
      "login": "user2",
    },
    "state": "APPROVED"
    "submitted_at": "2024-01-23T19:18:31Z",
  }
]

之后我可以在 bash 中循环以从对象中收集我需要的信息。

这可能已经在某个地方得到了回答,但我想我正在努力在搜索引擎中提出问题,以便能够获得所需的结果。

json bash jq
1个回答
0
投票

为了得到我期望的 JSON,我使用了以下 jq 语句。

jq '. |= sort_by(.submitted_at) | reverse | unique_by(.user.login)' "$tmp_response_file_pr_reviews_request"

这会按照

submitted_at
的尊重对结果数组进行排序,以便最高日期位于顶部,然后使用
unique_by
过滤到数组中每个 `user.login 键值对的第一个实例,得到了我需要的东西。

© www.soinside.com 2019 - 2024. All rights reserved.