【问题标题】:jq - Get objects with latest datejq - 获取最新日期的对象
【发布时间】:2022-04-15 10:15:40
【问题描述】:

Json 看起来像这样:

cat test.json |jq -r ".nodes[].run_data"

  {   
    "id": "1234",   
    "status": "PASSED",
    "penultimate_status": "PASSED",   
    "end_time":"2022-02-28T09:50:05Z" 
  } 
  {
    "id": "4321",   
    "status": "PASSED",  
    "penultimate_status": "UNKNOWN",
    "end_time": "2020-10-14T13:52:57Z"
 }

我想获取最新运行的“状态”和“结束时间”。不幸的是,订单不固定。这意味着最新的运行可以是列表中的第一个,也可以是最后一个或中间...

【问题讨论】:

标签: jq


【解决方案1】:

使用sort_by将项目整理好,然后提取last项目:

jq '
  [.nodes[].run_data]
  | sort_by(.end_time) | last
  | {status, end_time}
' test.json
{
  "status": "PASSED",
  "end_time": "2022-02-28T09:50:05Z"
}

要获取其他格式的字段,请将{status, end_time} 替换为您的格式,例如"\(.end_time): Status \(.status)",并设置 -r 标志,因为这不再是 JSON,而是原始文本。

【讨论】:

  • 为什么不将问题标记为重复?
  • @0stone0 根据How do I write a good answer 的说法,这样做的唯一原因是“为自己省点挫折”。我找不到提到的任何其他原因。而且,老实说,帮助别人让我感到非常满意,而不是为这种特殊情况是否重复而分心,等等。不知何故,这只会让其他人感到沮丧。虽然有一些相似之处,但最终的问答平台并不等同于参考书。你现在可以继续并结束这个问题,我唯一的目标是帮助某人得到他们的答案。
  • This post 说:“简而言之:如果一个问题与另一个问题重复,请标记或投票结束。”。如果您真的想帮助 OP,但有同样的问题无济于事,您可以创建一个社区答案 SO/
  • @0stone0 您的帖子还回答“我应该回答吗?” “一般来说,不,如果您认为它是重复的,则不会。也就是说,请尝试从提问者的角度和感知技能水平来看待建议的目标。”这正是我正在做的。由我自己思考它是什么。而且我通常不认为问题是 100% 重复的(有某些例外和 YMMV)。我正在“从提问者的角度和感知的技能水平”看,并认为:如果他们有方法并成功地从类似甚至重复的问题中找到解决方案,他们就不会问。
  • 请注意,这仅适用于所有时间戳使用相同偏移量的情况。提供的示例数据就是这种情况,但所讨论的格式 (RFC 3339) 允许使用除 Z 之外的偏移量。
【解决方案2】:

您可以使用transpose 将每个对象与其 end_time 进行映射。

在这里,我将end_time 转换为自 Unix 纪元以来的秒数,并输出具有最大秒数值的对象(这是最新的)。

[
[. | map(.end_time | strptime("%Y-%m-%dT%H:%M:%SZ") | mktime), [.[0], .[1]]] 
| transpose[] 
| .[1] += {secs: .[0]} | .[1]
] 
| sort_by(.secs) | last 
| {status, end_time}

输出

{
  "status": "PASSED",
  "end_time": "2022-02-28T09:50:05Z"
}

演示

https://jqplay.org/s/w1z2n2drc7

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 2021-11-28
    • 2021-10-10
    相关资源
    最近更新 更多