summaryrefslogtreecommitdiffstats
path: root/funtools/funtbl.tmpl
diff options
context:
space:
mode:
Diffstat (limited to 'funtools/funtbl.tmpl')
-rwxr-xr-xfuntools/funtbl.tmpl202
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
+}
+'
+