awk - 以毫秒为单位查找时间差 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 -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
推荐阅读
- cookies - 您可以在没有设置名称的谷歌标签管理器中读取 Cookie 吗?
- python - AWS 预签名 URL 生成
- python - 如何构建有效的 K-means 算法?
- javascript - 在 Javascript/Node.js 中将 CSS 文件转换为字符串
- javascript - 是否可以在安装之前在 Vuex getter 中返回包装对象的内部对象的值?
- powershell - power shell脚本输出到txt文件
- google-apps-script - 使用谷歌应用脚本获取特定列中具有值的单元格的计数(整数)
- java - 如何将 .json 文件中的数组加载到 App 中
- swift - 如何:使用 Swift UI 设置文本的背景颜色
- python - 有没有办法使用 librosa 以字节为单位设置音频文件的样本大小?