#!/bin/sh -
tmpfile=/tmp/zmstat$$
awk '
BEGIN	{
		key["uid"] = "uid"
		key["gid"] = "gid"
		key["size"] = "size"
		key["headersize"] = "headersize"
		key["bodysize"] = "bodysize"
		key["delay"] = "delay"
		key["resent"] = "resent"
		key["trusted"] = "trusted"
		key["external"] = "external"
		key["rcvdfrom"] = "rcvdfrom"
		key["with"] = "with"
		value["size"] = 0
		for (i in value)
			value[i] = 0
}
/ file: / {
		s = substr($0,index($0," file: ")+7)
		i = index(s, " ")+1
		s = substr(s,i,index(s, " =>")-i)
		i = index(s, "<")
		if (i > 0)
			s = substr(s, i+1)
		i = index(s, ":")
		if (i > 0)
			s = substr(s, i+1)
		i = index(s, ">")
		if (i > 0)
			s = substr(s, 1, i-1)
		sender = s
}
/ info: / {
		count += 1
		for (i=1; i < NF ; ++i) {
			if (key[$i]) {
				value[key[$i]] = $(i+1)
				if (key[$i] == "external")
					++i;
			}
		}
		uid[value["uid"]] += 1
		gid[value["gid"]] += 1
		size += value["size"]
		bytes[value["uid"]] += value["size"]
		grbytes[value["gid"]] += value["size"]
		headersize += value["headersize"]
		bodysize += value["bodysize"]
		delay += value["delay"]
		resent[value["resent"]] += 1
		trusted[value["trusted"]] += 1
		if (value["rcvdfrom"] != 0)
			rcvdfrom[value["rcvdfrom"]] += 1
	# If the message was local
		price = 0.40
		if (value["size"] > 10000)
			price += 0.10*(value["size"]-10000)/1000
		if (value["external"] == 0) {
			cost[value["uid"]] += price
			grcost[value["gid"]] += price
		} else if (value["rcvdfrom"] != 0) {
			external += 1
			cost[value["rcvdfrom"]] += price
			rbytes[value["rcvdfrom"]] += value["size"]
		} else
			external += 1
		postage[sender] += price
		pcount[sender] += 1
		pbytes[sender] += value["size"]
		if (value["with"] != 0) {
			with[value["with"]] += 1
			wbytes[value["with"]] += value["size"]
			wcost[value["with"]] += price
		}
		for (i in value)
			value[i] = 0
}
END {
	print "size = " size " avg = " size / count
	print "headersize = " headersize " avg = " headersize / count
	print "bodysize = " bodysize " avg = " bodysize / count
	print "avg delay = " delay / count
	print "resent yes = " resent["yes"] " no = " resent["no"]
	print "trusted yes = " trusted["yes"] " no = " trusted["no"]
	print "external = " external
	print
	for (i in uid)
		printf "%d\t%d\t%d\t%8.2f\n", \
			i, uid[i], bytes[i], cost[i] > "'$tmpfile.uid'"
	for (i in gid)
		printf "%d\t%d\t%d\t%8.2f\n", \
			i, gid[i], grbytes[i], grcost[i] > "'$tmpfile.gid'"
	for (i in with)
		printf "%s\t%d\t%d\t%8.2f\n", \
			i, with[i], wbytes[i], wcost[i] > "'$tmpfile.with'"
	for (i in rcvdfrom)
		printf "%s\t%d\t%d\t%8.2f\n", \
			i, rcvdfrom[i], rbytes[i], cost[i] > "'$tmpfile.rcvd'"
	for (i in postage)
		printf "%s\t%d\t%d\t%8.2f\n", \
			i,pcount[i], pbytes[i], postage[i] > "'$tmpfile.sender'"
}'
echo "UID"
sort +3nr $tmpfile.uid
echo
echo "GID"
sort +3nr $tmpfile.gid
echo
echo "WITH"
sort +3nr $tmpfile.with
echo
echo "Received From"
sort +3nr $tmpfile.rcvd
echo
echo "Postage"
sort +3nr $tmpfile.sender


syntax highlighted by Code2HTML, v. 0.9.1