2010-10-28 64 views
6

Tôi có các hàng sau trong tệp mà tôi muốn lấy mức trung bình của cột thứ 3 theo giờ.Trung bình của cột theo giờ (hàng) sử dụng awk

2010-10-28 12:02:36: 5.1721851 secs 
2010-10-28 12:03:43: 4.4692638 secs 
2010-10-28 12:04:51: 3.3770310 secs 
2010-10-28 12:05:58: 4.6227063 secs 
2010-10-28 12:07:08: 5.1650404 secs 
2010-10-28 12:08:16: 3.2819025 secs 

2010-10-28 13:01:36: 2.1721851 secs 
2010-10-28 13:02:43: 3.4692638 secs 
2010-10-28 13:03:51: 4.3770310 secs 
2010-10-28 13:04:58: 3.6227063 secs 
2010-10-28 13:05:08: 3.1650404 secs 
2010-10-28 13:06:16: 4.2819025 secs 

2010-10-28 14:12:36: 7.1721851 secs 
2010-10-28 14:23:43: 7.4692638 secs 
2010-10-28 14:24:51: 7.3770310 secs 
2010-10-28 14:25:58: 9.6227063 secs 
2010-10-28 14:37:08: 7.1650404 secs 
2010-10-28 14:48:16: 7.2819025 secs 

Tôi đã làm

cat filename | awk '{sum+=$3} END {print "Average = ",sum/NR}' 

với sản lượng

Average = 4.49154 

để có được mức trung bình cho toàn bộ tập tin, nhưng muốn phá vỡ mức trung bình xuống theo giờ. Tôi có thể lẻn một grep cho giờ trước khi đường ống đầu ra để awk, nhưng tôi muốn, hy vọng, làm điều đó với một lót.

Lý tưởng nhất, sản lượng sẽ là một cái gì đó giống như

Average 12:00 = _computed_avg_ 
Average 13:00 = _computed_avg_ 
Average 14:00 = _computed_avg_ 

và vân vân.

Không nhất thiết tìm kiếm câu trả lời, nhưng hy vọng sẽ được chỉ đúng hướng.

Rất cám ơn!

KM

Trả lời

11

tôi sẽ thiết lập các delimiter trường để thư đại tràng, sau đó tổng hợp trong một mảng kết hợp cho các phím khác nhau trong mảng, và cuối cùng là tính toán giá trị trung bình:

gawk -F: 'NF == 4 { sum[$1] += $4; N[$1]++ } 
      END  { for (key in sum) { 
         avg = sum[key]/N[key]; 
         printf "%s %f\n", key, avg; 
        } }' filename | sort 

On dữ liệu thử nghiệm của bạn, điều này mang lại:

2010-10-28 12 4.348022 
2010-10-28 13 3.514688 
2010-10-28 14 7.681355 

Điều này sẽ tạo ra câu trả lời đúng ngay cả khi dữ liệu không theo thứ tự thời gian (giả sử bạn ghép hai tệp nhật ký ra khỏi chuỗi). Lưu ý rằng gawk sẽ tính tổng giá trị '3.123 giây' theo số lượng. Loại cuối cùng trình bày mức trung bình theo trình tự thời gian; không đảm bảo rằng các phím sẽ được in theo trình tự thời gian.

+0

hoạt động như một sự quyến rũ. cảm ơn cả Jonathan và Novikov. Tôi bây giờ sẽ đảo ngược kỹ sư nó và cố gắng hiểu những gì tất cả các phần khác nhau (đặc biệt là mảng) làm ... (-; –

3

Awk có mảng kết hợp để bạn có thể lưu trữ trung bình theo giờ.

Các vấn đề liên quan