使用される仮想メモリの量(最大1 MB)を減らすために、オフコア分割征服アルゴリズムを実装するUNIXユーティリティを使用する必要があります。 Apacheログファイルである大規模なデータセットがあります。すべてのIPアドレスと日付(Unix時間に変換)を抽出し、それをHitsという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アドレスを含むすべてのヒットを見つけて、そのセッションに存在することを確認する必要があります。 7番目のヒットは対応するIPアドレスを持ち、30分以内であるため、セッションファイル1041502097 - 1041502001 = 97 sec
に書き込む必要があります。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
あなたに本当に必要なものが何であるかよくわかりません。これはほとんど答えではなく貢献です。
次に、「セッション」の数を数え、クリック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 * 60秒
- 役立つ場合は、並べ替えて印刷してください。
print a[session][ip], ip , session | "sort -Vr"