jq - 获取具有最新日期的对象

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

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
2个回答
3
投票

您可以使用

max_by
检索谓词值最高的项目。或者,使用
sort_by
将项目按谓词顺序排列,然后使用
last
或位置
-1
:

提取最后一项
jq '
  [.nodes[].run_data]
  | max_by(.end_time)
      # or: sort_by(.end_time) | last
      # or: sort_by(.end_time)[-1]
  | {status, end_time}
' test.json
{
  "status": "PASSED",
  "end_time": "2022-02-28T09:50:05Z"
}

要生成格式化输出,请将

{status, end_time}
替换为相应格式的字符串,例如
"\(.end_time): Status \(.status)"
,并为 JSON 解码(原始)输出设置
-r
标志。


1
投票

您可以使用

transpose
来映射每个对象及其结束时间。

这里我将

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

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