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

jq - Get objects with latest date

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"
 }

我想获取最新 运行 的“状态”和“end_time”。不幸的是,顺序不固定。意思是最新的 运行 可以排在列表的第一位,也可以排在最后或中间...

使用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,而是原始文本。

您可以使用 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