按日期对JQ中的多个对象进行排序/过滤

时间:2018-07-06 16:24:03

标签: json sorting datetime jq

我正在尝试使用JQ在Nexus API查询中查找最新的工件。现在,我的JSON输出看起来像:

{
  "items" : [ {
    "downloadUrl" : "https://nexus.ama.org/repository/Snapshots/org/sso/browser-manager/1.0-SNAPSHOT/browser-manager-1.0-20180703.144121-1.jar",
    "path" : "org/sso/browser-manager/1.0-SNAPSHOT/browser-manager-1.0-20180703.144121-1.jar",
    "id" : "V0FEQS1TbmFwc2hvdHM6MzhjZDQ3NTQwMTBkNGJhOTY1N2JiOTEyMTM1ZGRjZWQ",
    "repository" : "Snapshots",
    "format" : "maven2",
    "checksum" : {
      "sha1" : "7ac324905fb1ff15ef6020f256fcb5c9f54113ca",
      "md5" : "bb25c483a183001dfdc58c07a71a98ed"
    }
  }, {
    "downloadUrl" : "https://nexus.ama.org/repository/Snapshots/org/sso/browser-manager/1.0-SNAPSHOT/browser-manager-1.0-20180703.204941-2.jar",
    "path" : "org/sso/browser-manager/1.0-SNAPSHOT/browser-manager-1.0-20180703.204941-2.jar",
    "id" : "V0FEQS1TbmFwc2hvdHM6MzhjZDQ3NTQwMTBkNGJhOWM4YjQ0NmRjYzFkODkxM2U",
    "repository" : "Snapshots",
    "format" : "maven2",
    "checksum" : {
      "sha1" : "b4ba2049ea828391c720f49b6668a66a8b0bca9c",
      "md5" : "6757c55c0e6d933dc90e398204cca966"
    }
  } ],
  "continuationToken" : null
}

我设法使用JQ将数据重新打包为:

.items[] | { "id" : .id,  "date" : (.path |  scan("[0-9]{8}\\.[0-9-]*")) } 

输出:

{
  "id": "V0FEQS1TbmFwc2hvdHM6MzhjZDQ3NTQwMTBkNGJhOTY1N2JiOTEyMTM1ZGRjZWQ",
  "date": "20180703.144121-1"
}
{
  "id": "V0FEQS1TbmFwc2hvdHM6MzhjZDQ3NTQwMTBkNGJhOWM4YjQ0NmRjYzFkODkxM2U",
  "date": "20180703.204941-2"
}

现在,我有点想找出两个JSON对象中的哪个是最新的。如何按日期排序并提取该对象的ID?

是否有更好的方法来过滤/排序此数据?我的示例在JSON响应中只有2个项目[],但可能有很多。

1 个答案:

答案 0 :(得分:1)

过滤器sort_by/1将按时间顺序对时间戳进行排序,但是它需要一个数组作为输入,因此您可以编写:

.items 
| map({ "id" : .id,  "date" : (.path |  scan("[0-9]{8}\\.[0-9-]*")) })
| sort_by(.date)
| .[-1]

结尾的.[-1]选择最后一个项目,因此输入以下内容即可:

{
  "id": "V0FEQS1TbmFwc2hvdHM6MzhjZDQ3NTQwMTBkNGJhOWM4YjQ0NmRjYzFkODkxM2U",
  "date": "20180703.204941-2"
}