ossp-pkg/shtool/sh.table
1.17
##
## table -- Pretty-print a field-separated list as a table
## Copyright (c) 1998-2002 Ralf S. Engelschall <rse@engelschall.com>
## Originally written for Apache
##
## This file is part of shtool and free software; you can redistribute
## it and/or modify it under the terms of the GNU General Public
## License as published by the Free Software Foundation; either version
## 2 of the License, or (at your option) any later version.
##
## This file is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
## General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
## USA, or contact Ralf S. Engelschall <rse@engelschall.com>.
##
str_tool="table"
str_usage="[-F|--field-sep <sep>] [-w|--width <width>] [-c|--columns <cols>] [-s|--strip <strip>] <str><sep><str>..."
arg_spec="1+"
opt_spec="F:w:c:s:"
opt_alias="F:field-sep,w:width,c:columns,s:strip"
opt_F=":"
opt_w=15
opt_c=3
opt_s=79
. ./sh.common
if [ $opt_c -gt 4 ]; then
echo "$msgprefix:Error: Invalid number of colums (1..4 allowed only)" 1>&2
shtool_exit 1
fi
case "x$opt_F" in
x? ) ;;
* ) echo "$msgprefix:Error: Invalid separator (one char allowed only)" 1>&2; shtool_exit 1 ;;
esac
# split the list into a table
list=`
IFS="$opt_F"
for entry in $*; do
if [ ".$entry" != . ]; then
echo "$entry"
fi
done |\
awk "
BEGIN { list = \"\"; n = 0; }
{
list = list \\$1;
n = n + 1;
if (n < $opt_c) {
list = list \":\";
}
if (n == $opt_c) {
list = list \"\\n\";
n = 0;
}
}
END { print list; }
"
`
# format table cells and make sure table
# doesn't exceed maximum width
OIFS="$IFS"
IFS='
'
for entry in $list; do
case $opt_c in
1 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s\\n\", \$1); }'" ;;
2 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s %-${opt_w}s\\n\", \$1, \$2); }'" ;;
3 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s %-${opt_w}s %-${opt_w}s\\n\", \$1, \$2, \$3); }'" ;;
4 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s %-${opt_w}s %-${opt_w}s %-${opt_w}s\\n\", \$1, \$2, \$3, \$4); }'" ;;
esac
done |\
awk "{
if (length(\$0) > $opt_s) {
printf(\"%s\\n\", substr(\$0, 0, $opt_s-1));
} else {
print \$0;
}
}"
IFS="$OIFS"