处理带有时间戳的文本文件并每秒输出最后一行

Ste*_*mer 4 awk

我有一个 csv 文件,其中包含格式为纳秒分辨率的时间戳,"YYYY-MM-DDTHH:MM:SS.fffffffffZ"后跟一些数据

2021-04-26T09:30:04.786235633Z,102 
2021-04-26T09:30:04.786235633Z,524 
2021-04-26T09:30:04.786235633Z,566 
2021-04-26T09:30:04.791050014Z,391 
2021-04-26T09:30:09.882687589Z,922 
2021-04-26T09:30:09.886405549Z,744 
2021-04-26T09:30:09.886405549Z,702 
2021-04-26T09:30:14.986237837Z,436 
2021-04-26T09:30:14.986237837Z,636 
2021-04-26T09:30:14.986298532Z,353 
2021-04-26T09:30:14.986298532Z,445 
2021-04-26T09:30:14.986298532Z,785 
2021-04-26T09:30:14.986298532Z,917 
2021-04-26T09:30:20.086229659Z,195 
2021-04-26T09:30:20.086229659Z,228 
2021-04-26T09:30:20.086229659Z,486 
2021-04-26T09:30:20.086229659Z,41 
2021-04-26T09:30:20.086229659Z,421 
2021-04-26T09:30:20.090214746Z,386 
2021-04-26T09:30:25.186477272Z,678 
2021-04-26T09:30:25.186477272Z,198 
2021-04-26T09:30:25.190264104Z,459 
2021-04-26T09:30:25.190460283Z,123 
2021-04-26T09:30:25.190460283Z,318 
2021-04-26T09:30:26.442994013Z,200 
Run Code Online (Sandbox Code Playgroud)

我想以每秒只输出最后一行的方式处理它:

2021-04-26T09:30:04.791050014Z,391 
2021-04-26T09:30:09.886405549Z,702 
2021-04-26T09:30:14.986298532Z,917 
2021-04-26T09:30:20.090214746Z,386 
2021-04-26T09:30:25.190460283Z,318 
2021-04-26T09:30:26.442994013Z,200 
Run Code Online (Sandbox Code Playgroud)

是否可以使用 awk 或某些此类工具来执行此操作?

Sté*_*las 7

使用 GNU sort,您可以执行以下操作:

<file.csv sort -r | sort -suk1,1.19
Run Code Online (Sandbox Code Playgroud)

sort按时间倒序排列,然后按时间顺序对结果进行排序,但只考虑前 19 个字符以忽略亚秒,并使用-u(唯一的)选择第一个(由于前一个sort-s稳定的原因,它将是最近的一个order) 具有相同 19 个字符键的那些。

除了-k1,1.19,您还可以使用-t. -k1,1选择第一行之前的部分.作为排序键。

如果输入文件已按时间顺序,可以取代第一sorttac(或tail -r在某些系统上)。


Ste*_*itt 6

是的,这是可能的:跟踪最后一秒和相应的行,每当秒发生变化时,输出记忆的行:

awk -F. 'NR > 1 && lastsec != $1 { print lastline }
         { lastsec = $1; lastline = $0 }
         END { if (NR) print }'
Run Code Online (Sandbox Code Playgroud)