#!/usr/bin/ksh93 ################################################################ #### Program: comm_k93 #### #### Description: Emulation of the Unix "comm" command #### #### Author: Dana French (dfrench@mtxia.com) #### Copyright 2004 #### #### Date: 07/22/2004 #### ################################################################ function comm_k93 { typeset TRUE="0" typeset FALSE="1" typeset COL1="${TRUE}" typeset COL2="${TRUE}" typeset COL3="${TRUE}" typeset VERBOSE="${FALSE}" typeset VERYVERB="${FALSE}" typeset OPTION typeset ARRY1 typeset ARRY2 typeset ARRY3 typeset L1 typeset L2 typeset LINE1 typeset LINE2 typeset i typeset j typeset IDX typeset OUT while getopts ":123vV" OPTION do case "${OPTION}" in '1') COL1="${FALSE}";; '2') COL2="${FALSE}";; '3') COL3="${FALSE}";; 'v') VERBOSE="${TRUE}";; 'V') VERYVERB="${TRUE}";; '?') print "Syntax: comm_k93 [-123] [-] file ..." && exit 1 ;; esac done shift $(( ${OPTIND} - 1 )) typeset FILE1="${1:?ERROR: First File not specified}" typeset FILE2="${2:?ERROR: Second File not specified}" typeset STDIN1="${FALSE}" typeset UNIT1="3" if [[ "_${FILE1}" = '_-' ]] then STDIN1="${TRUE}" UNIT1="0" fi typeset STDIN2="${FALSE}" typeset UNIT2="4" if [[ "_${FILE2}" = '_-' ]] then STDIN2="${TRUE}" UNIT2="0" fi (( STDIN1 == TRUE && STDIN2 == TRUE )) && print "ERROR: Only one file may be read from STDIN" && exit 2 IFS="" (( STDIN1 == FALSE )) && eval exec ${UNIT1}\<"${FILE1}" typeset CNT1="0" while read -u ${UNIT1} -r -- LINE1 do ARRY1[${CNT1}]="${LINE1}" IDX[${CNT1}]="${TRUE}" (( CNT1++ )) done (( STDIN2 == FALSE )) && eval exec ${UNIT1}\<\&- (( STDIN2 == FALSE )) && eval exec ${UNIT2}\<"${FILE2}" typeset CNT2="${CNT1}" while read -u ${UNIT2} -r -- LINE2 do ARRY2[${CNT2}]="${LINE2}" IDX[${CNT2}]="${TRUE}" (( CNT2++ )) done (( STDIN2 == FALSE )) && eval exec ${UNIT2}\<\&- for L1 in "${!ARRY1[@]}" do for L2 in "${!ARRY2[@]}" do if [[ "_${ARRY1[${L1}]}" = "_${ARRY2[${L2}]}" ]] then ARRY3[${L1}]="${ARRY2[${L2}]}" unset ARRY2[${L2}] unset ARRY1[${L1}] unset IDX[${L2}] fi done done # for j in "${!ARRY1[@]}" "${!ARRY2[@]}" "${!ARRY3[@]}" # do # IDX[${j}]="${TRUE}" # done for i in "${!IDX[@]}" do (( COL1 == TRUE && COL2 == TRUE && COL3 == TRUE )) && OUT="${ARRY1[${i}]} ${ARRY2[${i}]} ${ARRY3[${i}]}" (( COL1 == TRUE && COL2 == TRUE && COL3 == FALSE )) && OUT="${ARRY1[${i}]} ${ARRY2[${i}]}" (( COL1 == TRUE && COL2 == FALSE && COL3 == FALSE )) && OUT="${ARRY1[${i}]}" (( COL1 == FALSE && COL2 == TRUE && COL3 == FALSE )) && OUT="${ARRY2[${i}]}" (( COL1 == TRUE && COL2 == FALSE && COL3 == TRUE )) && OUT="${ARRY1[${i}]} ${ARRY3[${i}]}" (( COL1 == FALSE && COL2 == FALSE && COL3 == TRUE )) && OUT="${ARRY3[${i}]}" (( COL1 == FALSE && COL2 == TRUE && COL3 == TRUE )) && OUT="${ARRY2[${i}]} ${ARRY3[${i}]}" [[ "${OUT}" = *[!$'\t']* ]] && print "${OUT}" done } ################################################################ comm_k93 "${@}"