사용되는 가상 메모리의 양(최대 1MB)을 줄이기 위해 오프 코어 분할 정복 알고리즘을 구현하는 UNIX 유틸리티를 사용해야 합니다. 아파치 로그 파일인 대규모 데이터 세트가 있습니다. 모든 IP 주소와 날짜(유닉스 시간으로 변환)를 추출하고 이를 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 주소가 포함된 모든 적중을 찾아 해당 세션에 있는지 확인해야 합니다. 일곱 번째 히트는 해당 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"