Convert integers to Extended Value format (bourne shell):
ev_map="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-." int_to_ev() { int="${1}" if [ ! "${int}" ] then printf "__" return fi [ "${int}" -lt 0 ] && int=0 [ "${int}" -gt 4095 ] && int=4095 hob=$(( ( ${int} / 64 ) + 1 )) lob=$(( ( ${int} % 64 ) + 1 )) printf "%s%s" "$(echo "${ev_map}" | cut -c${hob})" "$(echo "${ev_map}" | cut -c${lob})" } src_data() { cat link-20100704.log | awk -F'\t' '{ print $2 "\t" $1 }' } printf "http://chart.apis.google.com/chart?cht=lc&chs=1000x256&chd=e:"; src_data | head -n 768 | while read time rtt do int_to_ev $(( ${rtt} / 10 )) done min_avg_max() { while read min avg max; do echo "$(int_to_ev "${min}") $(int_to_ev "${avg}") $(int_to_ev "${max}")"; done | \ awk 'BEGIN{min="";avg="";max=""}{min=sprintf("%s%s", min, $1); avg=sprintf("%s%s", avg, $2); max=sprintf("%s%s", max, $3)}END{printf("%s,%s,%s", min, avg, max)}' } data() { date="${1:-2010-07-17}" sql=" SELECT STRFTIME('%Y-%m-%d %H:%M', DATETIME((( STRFTIME('%s', time) / 900 ) * 900 ), 'unixepoch')) AS tt, CAST(MIN(rtt) AS INTEGER) / 100 AS min, CAST(AVG(rtt) AS INTEGER) / 100 AS avg, CAST(MAX(rtt) AS INTEGER) / 100 AS max FROM rtt WHERE time BETWEEN '${date} 00:00:00' AND '${date} 23:59:59' GROUP BY tt; " sqlite3 data.db3 "${sql}" | sed -e 's/^[^|]*|//' | tr ' ' '_' | tr '|' ' ' } echo "http://chart.apis.google.com/chart?cht=lc&chs=1000x256&chco=00FF00,0000FF,FF0000&chd=e:$(data "2010-07-16"| min_avg_max)"
#!/usr/bin/awk -f BEGIN { ev_map="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-." } function int_to_ev(number) { if (int(number) != number) return "__" if ( number < 0 ) number = 0 if ( number > 4095 ) number = 4095 hob = int( number / 64 ) + 1 lob = int( number % 64 ) + 1 return sprintf("%s%s", substr(ev_map, hob, 1), substr(ev_map, lob, 1)) } { printf("%s", int_to_ev($1)) }