#!/bin/bash
##############################################################
# システム名    ：eo顧客基幹システム
#
# サブシステム名：契約管理
#
# シェル名      ：ファイル分割部品
#
# 機能          ：引数で指定されたファイルを分割します
#
# コマンド形式  ：FILE_SPLIT.sh
#
# 引数          ：「１」…分割ファイルパス
#               ：「２」…分割数
#               ：「３」…比較キーのカラム位置
#                         比較の必要がない場合は、「0」をセットしてください。
#
# 終了ステータス：「０」　…正常
#                 「９９」…異常
#
# 特記事項      ：特になし
#
# 変更履歴      ：変更日      変更者       障害／仕様変更No.
#
##############################################################

#
#--- ▼▼▼▼▼ 引数を取得する ▼▼▼▼▼
#

#
#--- ファイルパスを取得する（引数１）
#
FILE_PATH=$1

#
#--- ファイル分割数を取得する（引数２）
#
SPLIT_NUM=$2

#
#--- キー位置を取得する（引数３）
#
KEY_COL=$3

#
#--- ▼▼▼▼▼ 引数をチェックする ▼▼▼▼▼
#

#
#--- ファイルパスをチェックする
#
if [ ! -r ${FILE_PATH} ]
then
    echo '引数１が不正です。'
    exit 99
fi

#
#--- ファイル分割数をチェックする
#
if [ "`echo ${SPLIT_NUM} | grep '^[0-9]\+$'`" = '' ]
then
    echo '引数２が不正です。'
    exit
fi

#
#--- キー位置をチェックする
#
if [ "`echo ${KEY_COL} | grep '^[0-9]\+$'`" = '' ]
then
    echo '引数３が不正です。'
    exit
fi

#
#--- ▼▼▼▼▼ 変数を設定する ▼▼▼▼▼
#

#
#--- ファイルパスを「.」で分割する
#
FILE_PATH_BF=`echo ${FILE_PATH} | awk -F. '{print $1}'`
FILE_PATH_AF=`echo ${FILE_PATH} | awk -F. '{print $2}'`

#
#--- 対象ファイルの行数を取得する
#
ALL_LINE_CNT=`cat ${FILE_PATH} | wc -l`

#
#--- 行数を、指定数で割る
#
SPLIT_LINE_CNT=$((${ALL_LINE_CNT} / ${SPLIT_NUM}))

#
#--- 割った余りを取得する
#
REST_NUM=$((${ALL_LINE_CNT} - $((${SPLIT_LINE_CNT} * ${SPLIT_NUM}))))

#
#--- デバッグ
#
#echo 'FILE_PATH      : '${FILE_PATH}
#echo 'SPLIT_NUM      : '${SPLIT_NUM}
#echo 'KEY_COL        : '${KEY_COL}
#echo 'ALL_LINE_CNT   : '${ALL_LINE_CNT}
#echo 'SPLIT_LINE_CNT : '${SPLIT_LINE_CNT}
#echo 'REST_NUM       : '${REST_NUM}

#
#--- ▼▼▼▼▼ アウトプットファイルをクリアする ▼▼▼▼▼
#
COUNT=0
while [ ${COUNT} -lt ${SPLIT_NUM} ]
do
    #
    #--- アウトプットファイルパス生成
    #
    if [ ${FILE_PATH_AF} = '' ]
    then
        OUT_FILE_PATH=${FILE_PATH_BF}_`printf "%02d" $((${COUNT} + 1))`
    else
        OUT_FILE_PATH=${FILE_PATH_BF}_`printf "%02d" $((${COUNT} + 1))`.${FILE_PATH_AF}
    fi

    #
    #--- アウトプットファイルをクリアする
    #
    cat /dev/null > ${OUT_FILE_PATH}

    COUNT=$((${COUNT} + 1))
done

#
#--- ▼▼▼▼▼ 分割処理を開始する ▼▼▼▼▼
#

#
#--- 端数カウント用変数
#
FRACT_CNT=0

#
#--- ファイルを分割する
#
COUNT=0
while [ ${COUNT} -lt ${SPLIT_NUM} ]
do
    #
    #--- 端数をカウントする
    #
    if [ ${COUNT} -le ${REST_NUM} ]
    then
        FRACT_CNT=$((${FRACT_CNT} + 1))
    fi

    #
    #--- ＳＴＡＲＴ行
    #
    if [ ${COUNT} -eq 0 ]
    then
        START_LINE=$(($((${COUNT} * ${SPLIT_LINE_CNT})) + 1 + ${FRACT_CNT} - 1))
    else
        START_LINE=$(($((${COUNT} * ${SPLIT_LINE_CNT})) + 1 + ${FRACT_CNT} - 1 + ${PLUS_LINE}))
    fi

    #
    #--- ＥＮＤ行
    #
    END_LINE=$(($(($((${COUNT} + 1)) * ${SPLIT_LINE_CNT})) + 1 + ${FRACT_CNT} - 1))
    if [ ${COUNT} -ge ${REST_NUM} ]
    then
        END_LINE=$((${END_LINE} - 1))
    fi

    #
    #--- キー比較
    #
    PLUS_LINE=0
    if [ ${KEY_COL} -ne 0 ]
    then
        if [ ${END_LINE} -ne ${ALL_LINE_CNT} ]
        then

            #
            #--- キーを比較する
            #
            while :
            do
                #
                #--- ＥＮＤ行のキーを取得する
                #
                KEY_VALUE=`cat ${FILE_PATH} | head -${END_LINE} | tail -1 | awk -F, '{print $'${KEY_COL}'}'`
                #
                #--- ＥＮＤ行の次の行のキーを取得する
                #
                KEY_VALUE_NEXT=`cat ${FILE_PATH} | head -$((${END_LINE} + 1)) | tail -1 | awk -F, '{print $'${KEY_COL}'}'`

                if [ ${KEY_VALUE} = ${KEY_VALUE_NEXT} ]
                then
                    #
                    #--- 一致する場合は、次の行を比較
                    #
                    END_LINE=$((${END_LINE} + 1))
                    PLUS_LINE=$((${PLUS_LINE} + 1))
                else
                    #
                    #--- 一致しない場合は、ループ処理終了
                    #
                    break
                fi

                #
                #--- ＥＮＤ行がファイルの最終行に到達したら、ループ終了
                #
                if [ ${END_LINE} -ge ${ALL_LINE_CNT} ]
                then
                    break
                fi
            done
        fi
    fi

    #
    #--- デバッグ
    #
    #echo $((${COUNT} + 1))'ファイル目 '${START_LINE}'行目 ～ '${END_LINE}'行目'

    #
    #--- アウトプットファイルパス生成
    #
    if [ ${FILE_PATH_AF} = '' ]
    then
        OUT_FILE_PATH=${FILE_PATH_BF}_`printf "%02d" $((${COUNT} + 1))`
    else
        OUT_FILE_PATH=${FILE_PATH_BF}_`printf "%02d" $((${COUNT} + 1))`.${FILE_PATH_AF}
    fi

    #
    #--- デバッグ
    #
    #echo 'OUT_FILE_PATH  : '${OUT_FILE_PATH}

    #
    #--- ファイルを分割する
    #
    cat ${FILE_PATH} | head -${END_LINE} | tail -$((${END_LINE} - ${START_LINE} + 1)) > ${OUT_FILE_PATH}

    #
    #--- ＥＮＤ行がファイルの最終行に到達したら、ループ終了
    #
    if [ ${END_LINE} -ge ${ALL_LINE_CNT} ]
    then
        break
    fi

    COUNT=$((${COUNT} + 1))
done

exit 0
