xref: /minix3/usr.sbin/traceroute/median.awk (revision 7f5f010bbdf8790a2e9ca9b907117ed4eb0d2ad3)
1*7f5f010bSBen Gras#!/bin/awk -f
2*7f5f010bSBen Gras#	$NetBSD: median.awk,v 1.5 1997/10/04 16:31:32 christos Exp $
3*7f5f010bSBen Gras/^ *[0-9]/	{
4*7f5f010bSBen Gras	# print out the median time to each hop along a route.
5*7f5f010bSBen Gras	tottime = 0; n = 0;
6*7f5f010bSBen Gras	for (f = 5; f <= NF; ++f) {
7*7f5f010bSBen Gras		if ($f == "ms") {
8*7f5f010bSBen Gras			++n
9*7f5f010bSBen Gras			time[n] = $(f - 1)
10*7f5f010bSBen Gras		}
11*7f5f010bSBen Gras	}
12*7f5f010bSBen Gras	if (n > 0) {
13*7f5f010bSBen Gras		# insertion sort the times to find the median
14*7f5f010bSBen Gras		for (i = 2; i <= n; ++i) {
15*7f5f010bSBen Gras			v = time[i]; j = i - 1;
16*7f5f010bSBen Gras			while (time[j] > v) {
17*7f5f010bSBen Gras				time[j+1] = time[j];
18*7f5f010bSBen Gras				j = j - 1;
19*7f5f010bSBen Gras				if (j < 0)
20*7f5f010bSBen Gras					break;
21*7f5f010bSBen Gras			}
22*7f5f010bSBen Gras			time[j+1] = v;
23*7f5f010bSBen Gras		}
24*7f5f010bSBen Gras		if (n > 1 && (n % 2) == 0)
25*7f5f010bSBen Gras			median = (time[n/2] + time[(n/2) + 1]) / 2
26*7f5f010bSBen Gras		else
27*7f5f010bSBen Gras			median = time[(n+1)/2]
28*7f5f010bSBen Gras
29*7f5f010bSBen Gras		print $1, median
30*7f5f010bSBen Gras	}
31*7f5f010bSBen Gras}
32