我需要使用实现核外分而治之算法的 UNIX 实用程序,以减少使用的虚拟内存量(上限为 1 mb)。我有一个很大的数据集,它是一个 apache 日志文件。我能够提取所有 IP 地址和日期(转换为 unix 时间)并将其存储在名为命中的 csv 文件中。
ip,timestamp
62.172.72.131,1041502001
62.121.107.115,1041809792
163.28.16.1,1043258352
216.37.59.126,1044304131
68.104.188.224,1044472900
66.137.118.69,1044543502
62.172.72.131,1041502098
207.181.42.20,1044646708
205.156.184.254,1045670100
80.225.248.61,1045779615
200.44.24.157,1046214366
193.63.247.68,1046260886
66.176.248.72,1046317786
216.249.85.109,1046566502
68.44.222.12,1046638290
130.113.69.66,1048009156
143.43.220.157,1048026293
我现在需要创建一个会话文件,其中包含IP、时间和点击次数。一节课时长 30 分钟。例如,对于命中,62.172.72.131
它必须查找文件并找到具有该 IP 地址的所有命中,并确定它是否在该会话中。第七次命中具有该 IP 地址,并且 1041502097 - 1041502001 = 97 sec
在 30 分钟内,因此我们必须写入 62.172.72.131,97,2
会话文件。这需要按 IP 地址进行分组并计算该 IP 地址的会话,即会话为 30 分钟,如果该会话之外的 IP 地址(>1800 秒)则必须生成新的会话行。
我已经编写了以下代码
awk 'BEGIN { FS=OFS=SUBSEP=","}{arr[$1]= $2 }END {for (i in arr) {...}}' hits.csv | sort -n
目前,我不知道如何计算会话,并且当我打印出 i 和 arr[i] 时,所有重复项都会消失。我认为按 IP 地址排序,那么来自同一 IP 的所有点击都会按顺序出现。
答案1
我不确定你真正需要什么......这主要是一个贡献,而不是一个答案。
下面我们计算一个“session”数,并统计点击a[session][ip]
次数
#!/usr/bin/gawk -f
BEGIN { FS=OFS="," }
{ session = int($2/1800); a[session][$1] ++ }
END { for(session in a){
for(ip in a[session]){
print a[session][ip], ip , session
}
}
}
笔记:
- 1800 = 30m * 60s
- 如果有用的话通过排序打印:
print a[session][ip], ip , session | "sort -Vr"