首页 > 解决方案 > 如何获得具有唯一值的输出,但仅使用重复键的最后一个实例 - unique_by

问题描述

我目前正在使用 jq 来解析一些 json。我想根据某个键检索唯一值。我遇到了unique_by。它只是为 key 获取唯一值,name但我仍然没有得到我想要的输出。据我了解,unique_by查看键值name并使用第一个实例,然后删除最终输出中的重复项。但是,我想获取最后一个重复键值name并将其显示在最终输出中。

下面是我想要的输出的一个例子。是否可以这样做unique_by或最好的方法是什么?

cat file.json

原始json:

[
    {
      "name": "app-fastly",
      "tag": "20210825-95-448f024",
      "image": "docker.io/repoxy/app-fastly:20210825-95-448f024"
    },
    {
      "name": "app-lovely",
      "tag": "20211004-2101-b6a256c",
      "image": "ghcr.io/repox/app-lovely:20211004-2101-b6a256c"
    },
    {
      "name": "app-lovely",
      "tag": "20211007-6622-b3fooba",
      "image": "ghcr.io/repoxy/app-lovely:20211007-6622-b3fooba"
    },
    {
      "name": "app-dogwood",
      "tag": "20210325-36-2a349e9",
      "image": "docker.io/repoxy/app-dogwood:20210325-36-2a349e9"
    }
]

Jq 命令:

cat file.json | jq 'unique_by( {name} )'

电流输出:

[
  {
    "name": "app-dogwood",
    "tag": "20210325-36-2a349e9",
    "image": "docker.io/repoxy/app-dogwood:20210325-36-2a349e9"
  },
  {
    "name": "app-fastly",
    "tag": "20210825-95-448f024",
    "image": "docker.io/repoxy/app-fastly:20210825-95-448f024"
  },
  {
    "name": "app-lovely",
    "tag": "20211004-2101-b6a256c",
    "image": "ghcr.io/repox/app-lovely:20211004-2101-b6a256c"
  }
]

期望的输出:

[
  {
    "name": "app-dogwood",
    "tag": "20210325-36-2a349e9",
    "image": "docker.io/repoxy/app-dogwood:20210325-36-2a349e9"
  },
  {
    "name": "app-fastly",
    "tag": "20210825-95-448f024",
    "image": "docker.io/repoxy/app-fastly:20210825-95-448f024"
  },
  {
    "name": "app-lovely",
    "tag": "20211007-6622-b3fooba",
    "image": "ghcr.io/repoxy/app-lovely:20211007-6622-b3fooba"
  }
]

标签: jsonjq

解决方案


如果你想要最后一个唯一的项目,只需reverse首先数组

jq 'reverse | unique_by( {name} )'

如果您想保留原始订单,请reverse稍后再返回

jq 'reverse | unique_by( {name} ) | reverse'

推荐阅读