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.

Reply via email to