1*c0b746e5SOllivier Robert# awk program to scan peerstats files and report errors/statistics 2*c0b746e5SOllivier Robert# 3*c0b746e5SOllivier Robert# usage: awk -f peer.awk peerstats 4*c0b746e5SOllivier Robert# 5*c0b746e5SOllivier Robert# format of peerstats record 6*c0b746e5SOllivier Robert# MJD sec ident stat offset (s) delay (s) disp (s) 7*c0b746e5SOllivier Robert# 49235 11.632 128.4.2.7 f414 -0.000041 0.21910 0.00084 8*c0b746e5SOllivier Robert# 9*c0b746e5SOllivier Robert# format of output dataset (time values in milliseconds) 10*c0b746e5SOllivier Robert# peerstats.19960706 11*c0b746e5SOllivier Robert# ident cnt mean rms max delay dist disp 12*c0b746e5SOllivier Robert# ========================================================================== 13*c0b746e5SOllivier Robert# 140.173.112.2 85 -0.509 1.345 4.606 80.417 49.260 1.092 14*c0b746e5SOllivier Robert# 128.4.1.20 1364 0.058 0.364 4.465 3.712 10.540 1.101 15*c0b746e5SOllivier Robert# 140.173.16.1 1415 -0.172 0.185 1.736 3.145 5.020 0.312 16*c0b746e5SOllivier Robert#... 17*c0b746e5SOllivier Robert# 18*c0b746e5SOllivier RobertBEGIN { 19*c0b746e5SOllivier Robert n = 0 20*c0b746e5SOllivier Robert MAXDISTANCE = 1.0 21*c0b746e5SOllivier Robert} 22*c0b746e5SOllivier Robert# 23*c0b746e5SOllivier Robert# scan all records in file 24*c0b746e5SOllivier Robert# 25*c0b746e5SOllivier Robert# we toss out all distances greater than one second on the assumption the 26*c0b746e5SOllivier Robert# peer is in initial acquisition 27*c0b746e5SOllivier Robert# 28*c0b746e5SOllivier Robert{ 29*c0b746e5SOllivier Robert if (NF >= 7 && ($7 + $6 / 2) < MAXDISTANCE) { 30*c0b746e5SOllivier Robert i = n 31*c0b746e5SOllivier Robert for (j = 0; j < n; j++) { 32*c0b746e5SOllivier Robert if ($3 == peer_ident[j]) 33*c0b746e5SOllivier Robert i = j 34*c0b746e5SOllivier Robert } 35*c0b746e5SOllivier Robert if (i == n) { 36*c0b746e5SOllivier Robert peer_ident[i] = $3 37*c0b746e5SOllivier Robert peer_tmax[i] = peer_dist[i] = -1e9 38*c0b746e5SOllivier Robert peer_tmin[i] = 1e9 39*c0b746e5SOllivier Robert n++ 40*c0b746e5SOllivier Robert } 41*c0b746e5SOllivier Robert peer_count[i]++ 42*c0b746e5SOllivier Robert if ($5 > peer_tmax[i]) 43*c0b746e5SOllivier Robert peer_tmax[i] = $5 44*c0b746e5SOllivier Robert if ($5 < peer_tmin[i]) 45*c0b746e5SOllivier Robert peer_tmin[i] = $5 46*c0b746e5SOllivier Robert dist = $7 + $6 / 2 47*c0b746e5SOllivier Robert if (dist > peer_dist[i]) 48*c0b746e5SOllivier Robert peer_dist[i] = dist 49*c0b746e5SOllivier Robert peer_time[i] += $5 50*c0b746e5SOllivier Robert peer_time_rms[i] += $5 * $5 51*c0b746e5SOllivier Robert peer_delay[i] += $6 52*c0b746e5SOllivier Robert peer_disp[i] += $7 53*c0b746e5SOllivier Robert } 54*c0b746e5SOllivier Robert} END { 55*c0b746e5SOllivier Robert printf " ident cnt mean rms max delay dist disp\n" 56*c0b746e5SOllivier Robert printf "==========================================================================\n" 57*c0b746e5SOllivier Robert for (i = 0; i < n; i++) { 58*c0b746e5SOllivier Robert peer_time[i] /= peer_count[i] 59*c0b746e5SOllivier Robert peer_time_rms[i] = sqrt(peer_time_rms[i] / peer_count[i] - peer_time[i] * peer_time[i]) 60*c0b746e5SOllivier Robert peer_delay[i] /= peer_count[i] 61*c0b746e5SOllivier Robert peer_disp[i] /= peer_count[i] 62*c0b746e5SOllivier Robert peer_tmax[i] = peer_tmax[i] - peer_time[i] 63*c0b746e5SOllivier Robert peer_tmin[i] = peer_time[i] - peer_tmin[i] 64*c0b746e5SOllivier Robert if (peer_tmin[i] > peer_tmax[i]) 65*c0b746e5SOllivier Robert peer_tmax[i] = peer_tmin[i] 66*c0b746e5SOllivier Robert printf "%-15s%5d%9.3f%9.3f%9.3f%9.3f%9.3f%9.3f\n", peer_ident[i], peer_count[i], peer_time[i] * 1e3, peer_time_rms[i] * 1e3, peer_tmax[i] * 1e3, peer_delay[i] * 1e3, peer_dist[i] * 1e3, peer_disp[i] * 1e3 67*c0b746e5SOllivier Robert } 68*c0b746e5SOllivier Robert} 69