#!/usr/bin/ksh93 ################################################################ #### Program: transpose_k93 #### #### Description: Transposes one or more columns of data into #### rows. Allows the user to specify insets and offsets within #### the dataset to select portions of data to transpose. #### #### Author: Dana French (dfrench@mtxia.com) #### #### Date: 07/22/2004 #### ################################################################ function transpose_k93 { typeset TRUE="0" typeset FALSE="1" typeset FNAME="" typeset DELIM="${IFS}" typeset XINSET="0" typeset XOFFSET="9999999999" typeset YINSET="0" typeset YOFFSET="9999999999" typeset VARS typeset VALS typeset STDIN="${1:+${FALSE}}" STDIN="${STDIN:-${TRUE}}" while getopts ":d:x#y#X#Y#vV" OPTION do case "${OPTION}" in 'r') REVERSE="${TRUE}";; 'd') DELIM="${OPTARG}";; 'x') XINSET="${OPTARG}";; 'y') YINSET="${OPTARG}";; 'X') XOFFSET="${OPTARG}";; 'Y') YOFFSET="${OPTARG}";; 'v') VERBOSE="${TRUE}";; 'V') VERYVERB="${TRUE}";; '?') print "Syntax: transpose [-d DELIMETER] [-x INSET] [-X OFFSET] [-y INSET] [-Y OFFSET]" && exit 1 esac done shift $(( ${OPTIND} - 1 )) typeset STDIN="${1:+${FALSE}}" STDIN="${STDIN:-${TRUE}}" if (( STDIN == TRUE )) then IFS="${DELIM}"$'\n' read -r -A -- VARS VALS=( "${VARS[@]}" $( cat ) ) IFS=$' \t\n' transposition_k93 VARS VALS "${DELIM}" ${XINSET} ${XOFFSET} ${YINSET} ${YOFFSET} else for FNAME in "${@}" do if [[ -f "${FNAME}" ]] then IFS="${DELIM}"$'\n' read -r -A -- VARS < "${FNAME}" VALS=( $( cat "${FNAME}" ) ) IFS=$' \t\n' transposition_k93 VARS VALS "${DELIM}" ${XINSET} ${XOFFSET} ${YINSET} ${YOFFSET} else print -u 2 "ERROR: \"${FNAME}\" does not exist or is not a regular file." fi done fi return 0 } ################################################################ function transposition_k93 { nameref VARS="${1}" nameref VALS="${2}" typeset DELIM="${3}" typeset XINSET="${4}" typeset XOFFSET="${5}" typeset YINSET="${6}" typeset YOFFSET="${7}" typeset CNUM COLS XCOLS typeset RNUM ROWS YROWS typeset C1="0" (( COLS = ${#VARS[*]} )) (( XCOLS = COLS )) (( XOFFSET <= COLS )) && (( XCOLS = XOFFSET - XINSET )) (( ROWS = ${#VALS[*]} / ${#VARS[*]} )) (( YROWS = ROWS )) (( YOFFSET <= ROWS )) && (( YROWS = ROWS - ( ROWS - YOFFSET + 1 ) )) for (( CNUM=XINSET; CNUM