On 8/11/07, Andris <[EMAIL PROTECTED]> wrote: > IMHO, column is one of the most underestimated utilities in UNIX. > Every utility should output different information if they are running > in a terminal or not. That way, shell scripting would be more > straightforward. > > While column - ts '<tab>' does help, it has some limitations. One > can't specify per-column separator, or alignment. Here's where algn > comes handy. > > algn takes a file, and aligns its columns (-a), and uses specified > separators to show them (-s). For example, given: > > 00 00 01 command > 00 00 01 commandsssssssssss > 00 00 01 commanddddddddddddddddd > 600 00 01 command > 00 00 01 command > 00 00 01 command > > algn -a ',,,l' -s ':,.' outputs: > > 00:00.01 command > 00:00.01 commandsssssssssss > 00:00.01 commanddddddddddddddddd > 600:00.01 command > 00:00.01 command > 00:00.01 command > > a option receives aligners in the style: '<aligner>,'; where <aligner> > is "l" or "r". > > s option receives separators in the same style: '<separator>'; where > <separator> can be any string _except_ one containing one or more > commas (this will be fixed). > > As the comment says, awk program is mostly Steffen Schuler's work; and > I thank him. > > I thought maybe could give it use, so I share it with you. > > Greetings! > > #!/bin/sh > > # Copyright (c) 2006, 2007 Andres Delfino <[EMAIL PROTECTED]> > # > # Permission to use, copy, modify, and distribute this software for any > # purpose with or without fee is hereby granted, provided that the above > # copyright notice and this permission notice appear in all copies. > # > # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES > # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF > # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR > # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES > # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN > # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF > # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. > > # awk program is 99% Steffen Schuler's work. > > name="${0##*/}" > exit_status=0 > > aligners= > separators= > > function show_usage > { > printf 'Usage: %s [-a aligners] [-s separators] [file ...]\n' "${name}" >& 2 > exit 1 > } > > while getopts ':a:s:' ch; do > case "${ch}" in > ( a ) > aligners="${OPTARG}" > ;; > ( s ) > separators="${OPTARG}" > ;; > ( ? ) > printf 'Invalid option.\n' >& 2 > show_usage > ;; > esac > done > > shift "$((${OPTIND} - 1))" > > awk_program=' \ > BEGIN \ > { \ > FS = " "; \ > aligners = split("'"${aligners}"'", aligner, ","); \ > separators = split("'"${separators}"'", separator, ","); \ > } \ > \ > { \ > for (field = 1; field <= NF; ++field) \ > { \ > fields[NR,field] = $field; \ > field_length = length($field); \ > \ > if (field_length > max_field_length[field]) \ > max_field_length[field] = field_length; \ > } \ > } \ > \ > END \ > { \ > for (record = 1; record <= NR; ++record) \ > { \ > for (field = 1; record SUBSEP field in fields; ++field) \ > { \ > if (field > 1) \ > if (field - 1 <= separators) \ > printf("%s", separator[field - 1]); \ > else \ > printf(" "); \ > \ > string = "%"; \ > \ > if (field <= aligners && aligner[field] == "l") \ > string = string "-"; \ > \ > string = string "*s"; \ > printf(string, max_field_length[field], fields[record,field]); \ > } \ > \ > printf("\n"); \ > } \ > } \ > ' > > if [ "${#}" -ge 1 ]; then > while [ "${1}" ]; do > if [ -e "${1}" ]; then > if [ -f "${1}" ]; then > if [ -r "${1}" ]; then > awk "${awk_program}" "${1}" > else > printf '%s: %s: Permission to read from file not granted\n' > "${name}" "${1}" >& 2 > exit_status=4 > fi > else > printf '%s: %s: File is not a regular file\n' "${name}" "${1}" >& 2 > exit_status=3 > fi > else > printf '%s: %s: File does not exist\n' "${name}" "${1}" >& 2 > exit_status=2 > fi > shift > done > elif ! [ -t 0 ]; then > awk "${awk_program}" > else > show_usage > fi > > exit "${exit_status}" >
Forgot to add that columns must be sepated with tabs.