Mt Xia: Technical Consulting Group
Business Continuity / Disaster Recovery / High Availability Data Center Automation / Audit Response / Audit Compliance
#!/usr/bin/ksh93 ################################################################ #### Program: column_k93 #### #### Description: Emulation of the Unix "column" command #### #### Author: Dana French (dfrench@mtxia.com) #### Copyright 2004 #### #### Date: 07/22/2004 #### ################################################################ function column_k93 { typeset TRUE="0" typeset FALSE="1" typeset VERBOSE="${FALSE}" typeset VERYVERB="${FALSE}" typeset SCRWID="80" typeset MAXWID="0" typeset IDX="0" typeset LINE typeset FNAME typeset TABS=" " while getopts ":c:vV" OPTION do case "${OPTION}" in 'c') SCRWID="${OPTARG}";; 'v') VERBOSE="${TRUE}";; 'V') VERYVERB="${TRUE}";; '?') print "Syntax: column_k93 [-] file ..." && return 4 ;; esac done shift $(( ${OPTIND} - 1 )) typeset STDIN="${1:+${FALSE}}" STDIN="${STDIN:-${TRUE}}" #### Read in the data either from STDIN or one or more files if (( STDIN == TRUE )) then while read -r -- LINE do if [[ "_${LINE}" != "_" ]] then ARRY[${IDX}]="${LINE}" (( ${#LINE} > MAXWID )) && MAXWID="${#LINE}" (( IDX++ )) fi done else for FNAME in "${@}" do exec 0<"${FNAME}" while read -r -- LINE do if [[ "_${LINE}" != "_" ]] then ARRY[${IDX}]="${LINE}" (( ${#LINE} > MAXWID )) && MAXWID="${#LINE}" (( IDX++ )) fi done exec 0<&- done fi #### Determine the number of data elements stored LASTIDX="${#ARRY[*]}" #### Determine the column Width based on the widest data value (( COLWID = MAXWID + ( 8 - ( MAXWID%8) ) )) #### Determine the number of columns to display within the screen width (( COLNBR = SCRWID / COLWID )) #### Determine the number of Rows Per Column (( RPERC = ( LASTIDX - 1 ) / COLNBR )) #### Determine the number of Tabs Per column (( TPERC = COLWID / 8 )) ROWCNT=1 CURCOL=1 while (( ROWCNT <= ( RPERC + 1 ) )) do (( LASTPOS = ( COLNBR * RPERC ) + ROWCNT )) (( COLNBR > RPERC )) && (( LASTPOS = LASTPOS + COLNBR - RPERC )) for (( POS=ROWCNT; POS<LASTPOS; POS = POS + RPERC + 1 )) do if (( CURCOL != 1 )) && [[ "_${ARRY[POS-1]}" != "_" ]] then (( TFILL = TPERC - ( ${#ARRY[PREVPOS]} / 8 ) )) print -r -n -- "${TABS:0:TFILL}" fi print -r -n -- "${ARRY[POS-1]}" if (( CURCOL == COLNBR )) then CURCOL=0 print fi (( PREVPOS = POS - 1 )) (( CURCOL++ )) done (( ROWCNT++ )) done return 0 } ################################################################ column_k93 "${@}"