在装有不带PERL的AIX的机器上,我需要过滤记录,如果它们具有相同的ID并且在四个小时内被注册,则将被视为重复的记录。

我使用AWK实现了此过滤器,效果很好,但是我需要更快的解决方案:

#Generar lista de Duplicados
awk'BEGIN {
FS =“,”
}
/好/ {
old [$ 8] = f [$ 8];
f [$ 8] = mktime($ 4,$ 3,$ 2,$ 5,$ 6,$ 7);
x [$ 8] ++;
}
/ OK / && x [$ 8]> 1 && f [$ 8]-旧[$ 8]

有什么建议?有没有改善环境的方法(预加载文件或类似的东西)?

输入文件已排序。

通过jj33建议的更正,我制作了一个新版本,对日期进行了更好的处理,但仍然保持低调,无法合并更多操作:


awk'BEGIN {
FS =“,”;
SECSPERMINUTE = 60;
SECSPERHOUR = 3600;
SECSPERDAY = 86400;
split(“ 0 31 59 90 120 151 181 212 243 273 304 334”,DAYSTOMONTH,“”);
split(“ 0 366 731 1096 1461 1827 2192 2557 2922 3288 3653 4018 4383 4749 5114 5479 5844 6210 6575 6940 7305”,DAYSTOYEAR,“”);
}
/好/ {
old [$ 8] = f [$ 8];
f [$ 8] = mktime($ 4,$ 3,$ 2,$ 5,$ 6,$ 7);
x [$ 8] ++;
}
/ OK / && x [$ 8]> 1 && f [$ 8] -old [$ 8] 2)&&(((y%4 == 0)&&(y%100!= 0))||(y%400 = = 0))){
d2m = d2m + 1;
}
d2y = DAYSTOYEAR [y-1999];
返回ss +(mm * SECSPERMINUTE)+(hh * SECSPEROUR)+(d * SECSPERDAY)+(d2m * SECSPERDAY)+(d2y * SECSPERDAY);
}
'

最佳答案

这听起来像是实际数据库的工作。甚至像SQLite之类的东西也可能在这里对您有所帮助。我看到的最大问题是您对“ 4小时内”的定义。这是一个滑动窗口问题,这意味着您不能简单地将所有数据量化为4小时片段...您必须为其他每个元素分别计算所有“附近”元素。啊。

07-27 13:48