diff options
Diffstat (limited to 'funtools/funtbl.tmpl')
-rwxr-xr-x | funtools/funtbl.tmpl | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/funtools/funtbl.tmpl b/funtools/funtbl.tmpl new file mode 100755 index 0000000..c230c0e --- /dev/null +++ b/funtools/funtbl.tmpl @@ -0,0 +1,202 @@ +#!/bin/sh + +EXE=AWK +N=1 +FILE=- +DOHEAD=0 +DORDB=0 +XHEAD="" +SEP=" " + +# process args +while [ x"$1" != x ]; do + case $1 in + -c) shift + COLS=$1 + shift + continue;; + -help|--help) + echo "usage:" + echo " " + echo " funtbl [switches] input_file" + echo " funtbl [switches] < input_file" + echo " " + echo "switches (optional):" + echo " " + echo " -c \"col1 ...\" # output columns numbers (def: all)" + echo " -h # prepend column names as a header" + echo " -H prefix # prepend prefix and column names" + echo " -n num # extract the nth data table (def: 1)" + echo " -p prog # awk program (def: host-specific)" + echo " -s sep # output separator (def: space)" + echo " -T # output rdb table format" + echo " " + echo " -help # print this message" + echo " " + echo "examples:" + echo " " + echo " funcnts -rs ... | funtbl -c \"1 3\" -n 4 -s \"\t\"" + echo " funtbl -c \"1 3\" -n 4 -h -s \"\t\" foo.out" + echo " funtbl -c \"1 3\" -n 4 -T foo.out" + echo " " + echo "All 3 will output the first and third columns of the fourth" + echo "table, with the columns separated by a tab. The second form" + echo "will output a single line header of column names. The third" + echo "form will output 2-line rdb header." + echo " " + exit 0;; + -h) DOHEAD=1 + XHEAD="# " + shift + continue;; + -H) DOHEAD=1 + shift + XHEAD=$1 + shift + continue;; + -n) shift + N=$1 + shift + continue;; + -p) shift + EXE=$1 + shift + continue;; + -s) shift + SEP=$1 + shift + continue;; + -T) DORDB=1 + DOHEAD=1 + SEP="\t" + shift + continue;; + *) FILE=$1 + shift + continue;; + esac +done + +cat $FILE | \ +$EXE ' + +BEGIN{ + I=0 + STATE=0 + N='"$N"' + COLS="'"$COLS"'" + DOHEAD='"$DOHEAD"' + DORDB='"$DORDB"' + SEP="'"$SEP"'" + XHEAD="'"$XHEAD"'" + if( COLS == "" ){ + NCOL=0 + } + else{ + NCOL=split(COLS,COLNAMES); + } +} + +# state 0: looking for nth header +STATE==0{ + last = cur + cur = $0 + dashes=0 + for(j=1; j<=NF; j++){ + if( $j ~ /--*/ ){ + dashes++; + } + else{ + break; + } + } + if( (dashes >= 1) && (dashes == NF) ){ + I=I+1 + if( I==N ){ + STATE=1 + LINES=0 + if( DOHEAD == 1 ){ + split(last, HEADER) + split($0, DASHES) + } + } + } +} + +# look for blank line to end row output +$0 ~ /^$/{ + if( STATE == 1 ){ + STATE=2 + } +} + +# state 1: output this line of data +STATE==1{ + # output header, if necessary + if( LINES == 0 ){ + if( DOHEAD == 1 ){ + # output as comment if not rdb + if( DORDB != 1 ){ + printf("%s", XHEAD) + } + # specific columns + if( COLS == "" ){ + for(i=1; i<=NF; i++){ + printf("%s", HEADER[i]) + if( i != NF ) + printf("%s", SEP) + } + printf("\n") + if( DORDB == 1 ){ + for(i=1; i<=NF; i++){ + printf("%s", DASHES[i]) + if( i != NF ) + printf("%s", SEP) + } + printf("\n") + } + } + # all columns + else{ + for(i=1; i<=NCOL; i++){ + printf("%s", HEADER[COLNAMES[i]]) + if( i != NCOL ){ + printf("%s", SEP) + } + } + printf("\n") + if( DORDB == 1 ){ + for(i=1; i<=NCOL; i++){ + printf("%s", DASHES[COLNAMES[i]]) + if( i != NCOL ){ + printf("%s", SEP) + } + } + printf("\n") + } + } + } + } + else{ + if( COLS == "" ){ + for(i=1; i<=NF; i++){ + printf("%s", $i) + if( i != NF ) + printf("%s", SEP) + } + printf("\n") + } + else{ + split($0, ARGS) + for(i=1; i<=NCOL; i++){ + printf("%s", ARGS[COLNAMES[i]]) + if( i != NCOL ) + printf("%s", SEP) + } + printf("\n") + } + } + LINES=LINES+1 +} +' + |