我有一个 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 或某些此类工具来执行此操作?
使用 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
选择第一行之前的部分.
作为排序键。
如果输入文件已按时间顺序,可以取代第一sort
与tac
(或tail -r
在某些系统上)。
是的,这是可能的:跟踪最后一秒和相应的行,每当秒发生变化时,输出记忆的行:
awk -F. 'NR > 1 && lastsec != $1 { print lastline }
{ lastsec = $1; lastline = $0 }
END { if (NR) print }'
Run Code Online (Sandbox Code Playgroud)