一款简单实用的报文编辑根据

#! /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



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值