首页 > 解决方案 > 以毫秒为单位查找时间差 awk 或 gawk

问题描述

我有包含大量数据的文件,格式如下

22159   | a | 2021-02-26 11:02:03.776 | 2021-02-26 11:02:04.740 <br/>
22160   | b | 2021-02-26 11:35:21.796 | 2021-02-26 11:35:22.674 <br/>
22161   | c | 2021-02-26 11:35:21.806 | 2021-02-26 11:35:22.841 <br/>
22161   | d | 2021-02-26 11:02:18.688 | 2021-02-26 11:02:19.594 <br/>
22182   | e | 2021-02-26 11:06:02.978 | 2021-02-26 11:06:03.815 <br/>
22183   | f | 2021-02-26 11:35:24.911 | 2021-02-26 11:35:25.791 <br/>
22184   | g | 2021-02-26 11:35:25.082 | 2021-02-26 11:35:26.121 <br/>
22199   | h | 2021-02-26 11:09:47.815 | 2021-02-26 11:09:48.499 <br/>
22200   | i | 2021-02-26 11:35:27.562 | 2021-02-26 11:35:28.660 <br/>
22200   | j | 2021-02-26 11:09:49.595 | 2021-02-26 11:09:50.596 <br/>

输出例如。

9535 a 2021-02-27 11:02:53.756 2021-02-27 11:02:53.947 0.191

我已绑定以下命令:

awk -F'|' 'function convert(t) {   cmd = "date +%s.%3N -d \""t"\" "; cmd|getline timemilli; return timemilli; } { t2=convert($4);t1=convert($3);printf $1"\t"$2"\t"$3"\t"$4"\t%.3f\n",t2-t1 }' filtered_data

它适用于小文件,但它给我大文件的错误

错误:

awk: cmd. line:1: (FILENAME=filtered_data FNR=516) fatal: cannot open pipe date +%s.%3N -d "2021-02-27 11:24:05.618" '(打开的文件太多)`

注意:我的文件大约 10 mb,我想在单次拍摄中找到差异。不循环遍历每一行。

有没有其他方法可以一次性做到这一点?

标签: awk

解决方案


你可以试试这个awk

awk -F'|' '
function convert(t,  cmd, timemilli) {
   cmd = "date +%s.%3N -d \""t"\" "
   cmd | getline timemilli
   close (cmd)  # close this cmd to avoid too many open files
   return timemilli
}
{
   t2=convert($4)
   t1=convert($3)
   printf "%s\t%.3f\n", $1"\t"$2"\t"$3"\t"$4, t2-t1
}' filtered_data

推荐阅读