目的:从新系统数据库中获取客户信息,读取客户文件中数据,并同步老系统数据库更新。
数据格式:
客户号1^O客户姓名1^O证件类型1^O证件号1^O手机号1
客户号2^O客户姓名2^O证件类型2^O证件号2^O手机号2
demo1.sh
#!/bin/bash
# 此功能是截取数据,并更新到数据库中
# 计时器
startTime=`date '+%Y-%m-%d %H:%M:%S'`
startTime_S=`date +%s`
DB_IP=127.0.0.1
DB_PORT=2828
DB_USR=root
DB_PSW=root
DB_NAME=demo
# 获取参数 sh命令外边带的参数
FILE_NUM=$1
FILE_NAME=$2
# 计数器
COUNT=0
ERROR_SQL_LOG="error_sql"${FILE_NAME}".1og"
touch $ERROR_SQL_LOG
# 文件位置
FILE_PLACE=/opt/ccaf/batch_process/batch script/test/${FILE_NAME}
# 将binary=进制中的^0分隔符替换成+
si=`echo 15 | awk '{print("%c", $1)}'` && sed 's/'$si'/+/g' $FILE_PLACE
# 循环执行文件每一行
while read -r line
do
# 客户内部编号
CUST_INRID=${line%%+*}
SPLIT_CUST_INRID=$CUST_INRID
SUB=${CUST_INRID:16:2}
if [ "${SUB}" = "99" ];then
CUST_INRID=${CUST_INRID:0:16}
else
case "$SUB" in
"00")
SUB=A
;;
"01")
SUB=B
;;
esac
CUST_INRID=${SUB}${CUST_INRID:1:15}
fi
# 客户姓名
ARR_LIST=${line#*+}
CUST_NME=${ARR_LIST%%+*}
# 证件类型
ARR_LIST=${ARR_LIST#*+}
ID_TP=${ARR_LIST%%+*}
# 证件号
ARR_LIST=${ARR_LIST#*+}
ID_TP=${ARR_LIST%%+*}
# 手机号
ARR_LIST=${ARR_LIST#*+}
ID_TP=${ARR_LIST%%+*}
# insert 语句
INSERT_SQL="INSERT INTO cust (字段) VALUES (值1),(值2);"
# update 语句
UPDATE_SQL="update cust set ....;"
# >/dev/null 2>&1 不显示错误
# mysql -h $DB_IP -P $DB_PORT -u $DB_USR -p $DB_PSW -D $DB_NAME -e "${UPDATE_SQL}" >/dev/null 2>&1
{
if [ -n CUST_INRID ];then
CUST_DATE=`mysql -h $DB_IP -P $DB_PORT -u $DB_USR -p $DB_PSW -D $DB_NAME -e "select count(1) from cust where csr_idn_ sky ='$CUST_INRID';"`
CUST_DATE=${CUST_DATE:0-1}
if [[ $CUST_DATE = "0" ]];then
# 最后加 & 代表后端执行
mysql -h $DB_IP -P $DB_PORT -u $DB_USR -p $DB_PSW -D $DB_NAME -e "$INSERT_SQL"
else
mysql -h $DB_IP -P $DB_PORT -u $DB_USR -p $DB_PSW -D $DB_NAME -e "${UPDATE_SQL}"
fi
fi
}|| {
# >> 最后增加; > 重定向,覆盖新增
echo ${CUST_INRID}"+"${SPLIT_CUST_INRID} >> $ERROR_SQL_LOG
}
COUNT=$(( $COUNT + 1 ))
if [[ $COUNT%2000 -eq 0 ]];then
# 执行数量打印
echo "The number of data executed : "$COUNT >> $ERROR_SQL_LOG
fi
done < $FILE_PLACE
endTime=`date '+%Y-%m-%d %H:%M:%S'`
endTime_S=`date +%s`
sumTime=$[ $endTime_S - $startTime_S ]
echo $[File_NAME]":""$startTime ---> $endTime" "Total:$sumTime seconds"
# 结束生产ok文件
touch ${FILE_NAME}".ok"
splitFile.sh
#!/bin/bash
#此功能是拆分文件
ADE_FILE_NAME=$1
lines=`cat ${ADE_FILE_NAME} | wc -l`
spiltlines=0
echo "lines :" ${lines}
if [ ${lines} -eq 0 ]
then
echo "The file is empty! "
echo "[WARN]: ${ADE_FILE_NAME}is empty"
exit 0
else
# 拆分5/6个文件
div=5
mod=$(expr $lines % $div)
splitlines=$(expr $lines / $div)
fi
echo "split lines :" $(splitlines}
if [ ${splitlines} -eq 0 ]
then
echo "The file is not fit for splae!"
exit o
else
ADE_FILE_NAME_Split=${ADE_FILE_NAME}.s
split -l ${splitlines} ${ADE_FILE_NAME} -d -a 3 ${ADE_FILE_NAME_Split}
fi
forsh.sh
#!/bin/bash
# 作为总执行命令,串联起拆分文件和读取文件插入数据库
# 示例:sh forsh.sh 101 demo1.sh tttt.txt
# forsh.sh为当前文件名称
# 101 为拆分的文件数量+1
# demo1.sh为执行sql语句脚本文件名称
# tttt.txt为拆分的数据文件的名称
#拆分的文件数量
NUM=$1
# 执行sql语句脚本文件名称
START_FILE_NME=$2
# 拆分的数据文件的名称
SPLIT_FILE_NME=$3
#拆分脚本
sh SplitFile.sh $SPLIT_FILE_NME
# 循环执行拆分的文件
for ((i=0;i<$NUM;i++))
do
if [ ${#i} -eq 1 ];then
# 增加最后一行
echo "end" >> $SPLIT_FILE_NME".s""00"$i
# 去除^M分隔符
dos2unix $SPLIT_FILE_NME".s""00"$i > /dev/null 2>&1
sh $$START_FILE_NME"00"$i $SPLIT_FLIE_NME".s""00"$i &
elif [ ${#i} -eq 2 ];then
echo "end" >> $SPLIT_FILE_NME".s""0"$i
dos2unix $SPLIT_FILE_NME".s""0"$i > /dev/null 2>&1
sh $$START_FILE_NME"0"$i $SPLIT_FLIE_NME".s""0"$i &
else
echo "end" >> $SPLIT_FILE_NME".s"$i
dos2unix $SPLIT_FILE_NME".s"$i > /dev/null 2>&1
sh $$START_FILE_NME$i $SPLIT_FLIE_NME".s"$i &
fi
done