#! /bin/bash
# author:Sun Xing
# 主要功能:对征信报文进行修改、删除、合并、重命名等操作,具体菜单项如下:
# 菜单1:查找包含XX内容的行,然后对该行某些内容进行替换。比如查找借贷业务大类为“垫款”的行,然后将其贷款发放形式改为“9-其他”。在匹配内容中就可以输入业务大类标签加码值"<BusiLines>41</BusiLines>", # 需要替换的内容中输入老的贷款发放形式标签加码值,替换后的内容输入新的标签加码值“<LoaFrm>9</LoaFrm>”
# 菜单2:将A标签内的值赋值给B标签。比如将报文中开户日期改为最近一次实际还款日期,A标签输入最近一次实际还款日期标签;B标签输入开户日期标签就可以了
# 菜单3:根据身份证删除关联报文。主要处理关联模块间关联不上的数据,比如有的客户有基本信息没有借贷数据、没有授信数据,这种情况就可以对关联不上的借贷数据、授信数据进行删除。操作方法是:先创建一个 # 名为id_num.txt的文件,里面存放所有需要删除的客户身份证号,然后在配置区域配置该文件的路径即可。
# 菜单4:报文重命名(流水号+N的方式,避免重传报文报错)。某些情况下,客户在测试环境中上传报文,可能顺序传错导致存在未入库数据,这时需要清库后重新上传,但人行测试环境清库清不了报文名字的记录,所以
# 重新上传的时候需要修改报文名字,此功能主要批量对报文名进行修改,修改逻辑是在报文名流水号上加上一个固定值,使报文名改变。固定值默认是100,也可在配置区进行修改。
# 菜单5:报文重命名(按照T+1的方式重新命名报文名)。按照T+1的方式对报文重命名,满足人行验收要求。
# 菜单6:查找包含XX内容的行,然后将A标签内的值赋值给B标签。该功能是对菜单1和菜单2进行整合,输入匹配内容后会去匹配相应的行,可支持正则匹配。应用场景举例:对还款方式是21-到期一次还本付息的报文,修改# 最近一次实际还款日期,改为与开户日期一致。
# 菜单7:统一报送模式修改区段码(修改报文名、报文头中区段码,不合并文件)。主要针对统一报送的机构,这种机构报文名和报文头中区段码是总部机构区段码,而其他地方,比如账户中区段码都是分支机构代码,
# 该功能批量对文件进行修改,将报文头、报文名中区段码改为总部代码,其他地方保留分支机构代码
# 菜单8:统一模式个人报文合并(同时修改报文名、报文头中区段码)。该功能与菜单7的区别是,菜单7不会对文件进行合并,而菜单8除了会修改报文名、报文头中区段码以外,还会对同一类型+同一天的报文进行合并。
# 菜单9:根据提供的正常报文拼接整笔删除报文
#
set -u
# 配置修改区域
# 身份证号文件路径【菜单3】
idnum_adr=/opt/idnum_test
# 流水号增加值【菜单4】
serial_num=100
# 区段码配置【菜单7】
new_block_code="X5206010000046"
# 区段码配置【菜单8】
quduanma="X5206010000046"
# 菜单函数
menu() {
cat << EOF
----------------------------报文编辑器-----------------------------------------------------------
- -
- 1 | 查找包含XX内容的行,然后对该行的其他内容进行替换 -
- 2 | 将A标签内的值赋值给B标签(B的值会改成A的值) -
- 3 | 根据身份证删除关联报文(请先配置身份证文件) -
- 4 | 报文重命名(流水号+N的方式,避免重传报文报错) -
5 | 报文重命名(按照T+1的方式重新命名报文名) -
6 | 查找包含XX内容的行,然后将A标签内的值赋值给B标签
7 | 统一报送模式修改区段码(修改报文名、报文头中区段码,不合并文件)
8 | 统一模式个人报文合并(同时修改报文名、报文头中区段码)
9 | 根据正常报文生成整笔删除报文
- 0 | quit -
------------------------------------------------------------------------------------------------
EOF
}
menu
# 输入提示
read -p " Input your option:" option
# 判断输入的是不是数字
date_str=`date +%Y%m%d`
expr $option + 1 2>/dev/null &> /dev/null
if [ $? -ne 0 ];then
echo "输入的不是数字"
exit 1
# 空值判断,输入项不能为空
elif [ -z $option ] ;then
echo "输入项不能为空"
exit 1
# 菜单选项为1时
elif [ $option -eq 1 ] ;then
read -p "请输入匹配行的内容: " pipei
read -p "请输入需要替换的内容: " old
read -p "请输入替换后的内容: " new
pipei=`echo "$pipei" | sed 's#/#\\\/#g'`
old=`echo "$old" | sed 's#/#\\\/#g'`
new=`echo "$new" | sed 's#/#\\\/#g'`
echo "pipei: $pipei old: $old new: $new"
# 在当前目录下创建新目录
if [ ! -d "$date_str""_baowen_1" ]; then
mkdir $date_str"_baowen_1"
fi
rm -rf "$date_str"_baowen_1/*
cp ./*.txt "$date_str"_baowen_1
# 循环对当前所有文件操作
for filename in `ls "$date_str"_baowen_1/*.txt`
do
sed -i "/$pipei/s/$old/$new/g" $filename
done
echo '已经处理完毕,请到 '"$date_str"'_baowen_1 目录查看'
exit 0
# 菜单选项为2时
elif [ $option -eq 2 ]; then
read -p "请输入A标签: " A_xml
read -p "请输入B标签: " B_xml
A_Xmltest=`echo ${A_xml#*<} | sed 's/>//'`
B_Xmltest=`echo ${B_xml#*<} | sed 's/>//'`
# 在当前目录下创建新目录
if [ ! -d "$date_str""_baowen_2" ]; then
mkdir $date_str"_baowen_2"
fi
rm -rf "$date_str"_baowen_2/*
# 循环对当前所有文件操作
for filename2 in `ls *.txt`
do
cat $filename2 | while read line
do
var=`echo $line`
A_xml_all=`echo $var | grep "<$A_Xmltest>.*</$A_Xmltest>" -o`
A_xml_value=`echo $A_xml_all | sed -e "s/<$A_Xmltest>//" -e "s/<\/$A_Xmltest>//"`
echo $line | sed "s/<$B_Xmltest>.*<\/$B_Xmltest>/<$B_Xmltest>$A_xml_value<\/$B_Xmltest>/" >>"$date_str"'_baowen_2'/$filename2
done
# 第一行中一个空格改成两个空格
sed "1s/\ /\ /" "$date_str"'_baowen_2'/$filename2 -i
done
echo '已将B的值改成A的值,请到 '"$date_str"' _baowen_2 目录查看'
exit 0
# 菜单选项为3时
elif [ $option -eq 3 ] ;then
# 在当前目录下创建新目录
if [ ! -d "$date_str""_baowen_3" ]; then
mkdir $date_str"_baowen_3"
fi
rm -rf "$date_str"_baowen_3/*
cp ./*.txt "$date_str"_baowen_3
for filename3 in `ls "$date_str"_baowen_3/*.txt`
do
for id_num in `cat $idnum_adr/id_num.txt`
do
# 删掉所有包含指定身份证号的行
sed -i "/$id_num/d" $filename3
done
# 统计报文总共多少行
line=`cat $filename3 | wc -l`
line1=`expr $line - 1`
# 统计结果总共7位,不足部分在前面加0
line2=`printf %07d $line1`
# 取出第一行
line_str=`sed -n '1p' $filename3`
# 第一行中用新的统计项
line_new=`echo "${line_str:0:43}$line2"`
# 替换第一行
sed -i "1c $line_new" $filename3
# 删掉行数小于2的文件
wc_num=`cat "$filename3" | wc -l`
if [ $wc_num -lt 2 ]
then
rm -rf ${filename3}
echo "删除空文件 ${filename3}"
fi
# 修改文件格式为dos
unix2dos -k $filename3 2>/dev/null
done
echo '已处理完毕,请到 '"$date_str"'_baowen_3 目录查看'
exit 0
# 菜单选项为4时
elif [ $option -eq 4 ] ;then
# 在当前目录下创建新目录
if [ ! -d "$date_str""_baowen_4" ]; then
mkdir $date_str"_baowen_4"
fi
rm -rf "$date_str"_baowen_4/*
cp ./*.txt "$date_str"_baowen_4
for filename4 in `ls "$date_str"_baowen_4/*.txt`
do
var=`expr "${filename4:44:3}" + "$serial_num"`
echo $var
if [ "$var" -lt "100" ] && [ "$var" -gt "10" ];then
var=`echo "0$var"`
elif [ "$var" -lt "10" ];then
var=`echo "00$var"`
fi
mv $filename4 `echo "${filename4:0:44}"$var${filename4:47:5}`
done
echo '已处理完毕,请到 '"$date_str"'_baowen_4 目录查看'
exit 0
# 菜单选项为5时
elif [ $option -eq 5 ] ;then
if [[ -a rptdate_.ok ]];then
rm -f rptdate_.ok
fi
rm -rf new 2>/dev/null
mkdir new
for filename in `ls *.txt`
do
grep -o '<RptDate>.*</RptDate>' $filename > rptdate.ok
sort -nr -k1.10 rptdate.ok > rptdate_sort.ok
max_rptdate=`head -n 1 rptdate_sort.ok`
rpt_date=`echo ${max_rptdate:9:10}`
rpt_date_end=`date -d "$rpt_date +1 day " +%Y%m%d`
echo "$rpt_date_end"
echo "$filename $rpt_date_end${filename:22:4}" >> rptdate_.ok
sed -i "1s/${filename:14:8}/$rpt_date_end/" $filename
done
sort -n -k1.23 rptdate_.ok > rptdate_sort_.ok
awk '{a[$2]++;print $1,$2,a[$2]}' rptdate_sort_.ok > rptdate_awk_.ok
cat rptdate_awk_.ok | while read line
do
var=`echo $line`
var1=`printf %03d ${var:48:4}`
mv ${var:0:34} new/${var:0:14}${var:35:12}$var1${var:29:5}
done
rm -f rptdate.ok
rm -f rptdate_.ok
rm -f rptdate_awk_.ok
rm -f rptdate_sort.ok
rm -f rptdate_sort_.ok
# 菜单选项为6时
elif [ $option -eq 6 ]; then
read -p "请输入匹配内容(支持正则):" pipei
read -p "请输入A标签: " A_xml
read -p "请输入B标签: " B_xml
A_Xmltest=`echo ${A_xml#*<} | sed 's/>//'`
B_Xmltest=`echo ${B_xml#*<} | sed 's/>//'`
# 在当前目录下创建新目录
if [ ! -d "$date_str""_baowen_6" ]; then
mkdir $date_str"_baowen_6"
fi
rm -rf "$date_str"_baowen_6/*
# 循环对当前所有文件操作
for filename6 in `ls *.txt`
do
cat $filename6 | while read line
do
var=`echo $line`
wc_pipei=`echo $var | grep $pipei | wc -l`
# 如果匹配不上就原样输入,否则进行替换
if [ $wc_pipei -eq 0 ] ;then
echo $var >>"$date_str"'_baowen_6'/$filename6
else
A_xml_all=`echo $var | grep "<$A_Xmltest>.*</$A_Xmltest>" -o`
A_xml_value=`echo $A_xml_all | sed -e "s/<$A_Xmltest>//" -e "s/<\/$A_Xmltest>//"`
echo $line | sed "s/<$B_Xmltest>.*<\/$B_Xmltest>/<$B_Xmltest>$A_xml_value<\/$B_Xmltest>/" >>"$date_str"'_baowen_6'/$filename6
fi
done
# 第一行中一个空格改成两个空格
sed "1s/\ /\ /" "$date_str"'_baowen_6'/$filename6 -i
done
echo '已完成匹配和替换,请到 '"$date_str"'_baowen_6 目录查看'
exit 0
# 菜单选项为7时
elif [ $option -eq 7 ] ;then
if [[ -a fff.ok ]]
then
rm -rf fff.ok
fi
if [[ -a kkk.out ]]
then
rm -rf kkk.out
fi
if [[ -a ccc.ok ]]
then
rm -rf ccc.ok
fi
for filename in `ls *.txt`
do
var3=`head -n +1 $filename`
var4=`echo ${var3:14:14}`
sed -i "1s/$var4/$new_block_code/" $filename
echo "$filename $new_block_code${filename:14:12}">> ./fff.ok
cat fff.ok | sort -k1.27 -n > ./ccc.ok
awk '{a[$2]++;print $1,$2,a[$2]}' ccc.ok > ./bbb.ok
done
cat bbb.ok | while read line
do
var=`echo $line`
var1=`printf %03d ${var:62:4}`
echo "var=$var var1=$var1 MV=${var:0:34} $new_block_code${var:14:12}$var1${var:29:5}">>kkk.out
mv ${var:0:34} $new_block_code${var:14:12}$var1${var:29:5}
done
# 菜单项为8时
elif [ $option -eq 8 ] ;then
# 在当前目录下创建新目录
if [ ! -d "new" ]; then
mkdir new
fi
rm -f new/*
for filename in `ls *.txt`
do
if [ ${filename:22:3} -eq 210 ];then
awk -F"><" 'NR>1{rptdate=substr($7,9,10);print $0 >> "new/"rptdate"_210.all"}' $filename
elif [ ${filename:22:3} -eq 110 ];then
awk -F"><" 'NR>1{rptdate=substr($9,9,10);print $0 >> "new/"rptdate"_110.all"}' $filename
elif [ ${filename:22:3} -eq 220 ];then
awk -F"><" 'NR>1{rptdate=substr($6,9,10);print $0 >> "new/"rptdate"_220.all"}' $filename
elif [ ${filename:22:3} -eq 510 ];then
awk -F"><" 'NR>1{rptdate=substr($6,9,10);print $0 >> "new/"rptdate"_510.all"}' $filename
fi
done
for filename in `ls new/*.all`
do
wcl=`cat $filename|wc -l`
wcl_=`printf "%07d\n" $wcl`
if [ ${filename:15:3} -eq 210 ];then
sed -i "1i A0502102.0.0 $quduanma${filename:4:4}${filename:9:2}${filename:12:2}1212120$wcl_" $filename
elif [ ${filename:15:3} -eq 110 ];then
sed -i "1i A0501102.0.010$quduanma${filename:4:4}${filename:9:2}${filename:12:2}0812170$wcl_" $filename
elif [ ${filename:15:3} -eq 220 ];then
sed -i "1i A0502202.0.0 $quduanma${filename:4:4}${filename:9:2}${filename:12:2}1315320$wcl_" $filename
elif [ ${filename:15:3} -eq 510 ];then
sed -i "1i A0505102.0.0 $quduanma${filename:4:4}${filename:9:2}${filename:12:2}1416220$wcl_" $filename
fi
unix2dos -k $filename 2>/dev/null
if [ ${filename:15:3} -eq 210 ];then
mv $filename new/$quduanma${filename:4:4}${filename:9:2}${filename:12:2}21000010.txt
elif [ ${filename:15:3} -eq 110 ];then
mv $filename new/$quduanma${filename:4:4}${filename:9:2}${filename:12:2}11000010.txt
elif [ ${filename:15:3} -eq 220 ];then
mv $filename new/$quduanma${filename:4:4}${filename:9:2}${filename:12:2}22000010.txt
elif [ ${filename:15:3} -eq 510 ];then
mv $filename new/$quduanma${filename:4:4}${filename:9:2}${filename:12:2}51000010.txt
fi
done
# 菜单项为9时
elif [ $option -eq 9 ] ;then
# 在当前目录下创建新目录
if [ ! -d "$date_str""_baowen_9" ]; then
mkdir $date_str"_baowen_9"
fi
rm -rf "$date_str"_baowen_9/*
# 提取整笔删除需要的账户号等信息,并且用awk添加标签,输出到新的文件中
for filename in `ls *.txt`
do
#个人
if [ ${filename:22:3} -eq 210 ];then
cat $filename | sed -r 's#^.*<AcctCode>(.*)</AcctCode>.*$#\1#g' | sed '1d' | awk '{print "<Document><InAcctEntDel><InfRecType>214</InfRecType><DelRecCode>"$1"</DelRecCode></InAcctEntDel></Document>"}' >> $date_str"_baowen_9"/210.bak
elif [ ${filename:22:3} -eq 110 ];then
cat $filename | sed -r 's#^.*<Name>(.*)</Name><IDType>(.*)</IDType><IDNum>(.*)</IDNum><InfSurcCode>(.*)</InfSurcCode>.*$#\1 \2 \3 \4#g' | sed '1d' | awk '{print "<Document><InBsInfDlt><InfRecType>114</InfRecType><Name>"$1"</Name><IDType>"$2"</IDType><IDNum>"$3"</IDNum><InfSurcCode>"$4"</InfSurcCode></InBsInfDlt></Document>"}' >> $date_str"_baowen_9"/110.bak
elif [ ${filename:22:3} -eq 220 ];then
cat $filename | sed -r 's#^.*<ContractCode>(.*)</ContractCode>.*$#\1#g' | sed '1d'|awk '{print "<Document><InCtrctEntDel><InfRecType>224</InfRecType><DelRecCode>"$1"</DelRecCode></InCtrctEntDel></Document>"}' >> $date_str"_baowen_9"/220.bak
elif [ ${filename:22:3} -eq 510 ];then
cat $filename | sed -r 's#^.*<CcCode>(.*)</CcCode>.*$#\1#g' | sed '1d'| awk '{print "<Document><MoCEntDel><InfRecType>514</InfRecType><DelRecCode>"$1"</DelRecCode></MoCEntDel></Document>"}' >> $date_str"_baowen_9"/510.bak
#企业
elif [ ${filename:22:3} -eq 410 ];then
cat $filename | sed -r 's#^.*<AcctCode>(.*)</AcctCode>.*$#\1#g' | sed '1d'| awk '{print "<Document><EnAcctInfEntDel><InfRecType>414</InfRecType><DelRecCode>"$1"</DelRecCode></EnAcctInfEntDel></Document>"}' >> $date_str"_baowen_9"/410.bak
elif [ ${filename:22:3} -eq 310 ];then
cat $filename | sed -r 's#^.*<EntName>(.*)</EntName><EntCertType>(.*)</EntCertType><EntCertNum>(.*)</EntCertNum><InfSurcCode>(.*)</InfSurcCode>.*$#\1 \2 \3 \4#g' | sed '1d'| awk '{print "<Document><EnBsInfDlt><InfRecType>314</InfRecType><EntName>"$1"</EntName><EntCertType>"$2"</EntCertType><EntCertNum>"$3"</EntCertNum><InfSurcCode>"$4"</InfSurcCode></EnBsInfDlt></Document>"}' >> $date_str"_baowen_9"/310.bak
elif [ ${filename:22:3} -eq 420 ];then
cat $filename | sed -r 's#^.*<ContractCode>(.*)</ContractCode>.*$#\1#g' | sed '1d'| awk '{print "<Document><EnCtrctInfEntDel><InfRecType>424</InfRecType><DelRecCode>"$1"</DelRecCode></EnCtrctInfEntDel></Document>"}'>> $date_str"_baowen_9"/420.bak
elif [ ${filename:22:3} -eq 610 ];then
grep '<EntName>.*</SheetTypeDivide>' $filename -o | sed 's#<RptDate>.*</RptDate>##g' | awk '{print "<Document><BalanceSheetDlt><InfRecType>614</InfRecType>"$0"</BalanceSheetDlt></Document>"}'>> $date_str"_baowen_9"/610.bak
elif [ ${filename:22:3} -eq 620 ];then grep '<EntName>.*</SheetTypeDivide>' $filename -o | sed 's#<RptDate>.*</RptDate>##g' | awk '{print "<Document><IncomeStatementProfitAppropriationDlt><InfRecType>624</InfRecType>"$0"</IncomeStatementProfitAppropriationDlt></Document>"}'>> $date_str"_baowen_9"/620.bak
elif [ ${filename:22:3} -eq 630 ];then grep '<EntName>.*</SheetTypeDivide>' $filename -o | sed 's#<RptDate>.*</RptDate>##g' | awk '{print "<Document><CashFlowsDlt><InfRecType>634</InfRecType>"$0"</CashFlowsDlt></Document>"}'>> $date_str"_baowen_9"/630.bak
elif [ ${filename:22:3} -eq 640 ];then grep '<EntName>.*</SheetTypeDivide>' $filename -o | sed 's#<RptDate>.*</RptDate>##g' | awk '{print "<Document><InstitutionBalanceSheetDlt><InfRecType>644</InfRecType>"$0"</InstitutionBalanceSheetDlt></Document>"}'>> $date_str"_baowen_9"/640.bak
elif [ ${filename:22:3} -eq 650 ];then grep '<EntName>.*</SheetTypeDivide>' $filename -o | sed 's#<RptDate>.*</RptDate>##g' | awk '{print "<Document><IncomeAndExpenseStatementDlt><InfRecType>654</InfRecType>"$0"</IncomeAndExpenseStatementDlt></Document>"}'>> $date_str"_baowen_9"/650.bak
elif [ ${filename:22:3} -eq 440 ];then
cat $filename | sed -r 's#^.*<AcctCode>(.*)</AcctCode>.*$#\1#g' | sed '1d'| awk '{print "<Document><EnSecAcctEntDel><InfRecType>444</InfRecType><DelRecCode>"$1"</DelRecCode></EnSecAcctEntDel></Document>"}' >> $date_str"_baowen_9"/440.bak
fi
done
# 对新文件去重
for bak in `ls $date_str"_baowen_9"/*.bak`
do
sort $bak | uniq >> ${bak:0:22}.txt
done
# 处理新文件,包括添加报文头、修改名字、转换编码格式
for newfile in `ls "$date_str"_baowen_9/*.txt`
do
wcl=`cat $newfile|wc -l`
wcl_=`printf "%07d\n" $wcl`
# 添加报文头
sed -i "1i A050${newfile:18:2}42.0.0 ${filename:0:14}${date_str}1132110$wcl_" $newfile
# 修改编码格式
unix2dos -k $newfile 2>/dev/null
#修改名称
mv $newfile "$date_str"_baowen_9/${filename:0:14}$date_str${newfile:18:2}400010.txt
done
echo '处理完毕,请到'"$date_str"'_baowen_9文件查看'
# 菜单项为0时
elif [ $option -eq 0 ]; then
echo "已退出"
exit 0
else
echo "输入项不在菜单栏中"
exit 1
fi
08-16
4192
01-20
518