一、首先设定配置文件:
############ ↓↓↓↓↓↓↓↓↓ ########### ############ 目录吧最后的/加上 ########### ############ ↑↑↑↑↑↑↑↑↑ ########### ## 电话信息文件中流水号字段名,以及分割的第几个位置(根据实际电话信息文件修) epcVoiceId=voiceId voiceId_lie=1 ## 电话信息中录音字段名,以及分割的第几个位置(针对音频本地处理有效,FTP方式可不作配置,不改动音频位置) epcVoiceUri=voiceUri voiceUri_lie=5 #1. epc翻倍工具 #复制epc文件的源文件位置(.txt文件) epcTaskFile=/iflytek/vie62/dmsTask/ #复制epc的录音位置,如果是远程ftp方式,此处位置可以不填 #epcTaskVoice=/iflytek/ahyd/dmsTask/ epcTaskVoice= ## 远程方式是否需要删除已下载且转写、转码完成的wav音频文件以节省服务器磁盘空间(默认false) rmDownVoice=true #复制后的epc文件生成位置,可以设置为epc的探测路径 epcCreateFile=/iflytek/vie62/DMS/ #复制epc文件数目 epcCreateNum=1 #监测epc还有多少文件未跑完,一般会设置成epc的batch目录,保证epc处理文件不为空(30s检查一次,可在doubleTask倒数第二行修改) epcNonFile=/iflytek/vie62/EPCTask/batch/ #2. dic翻倍工具 #复制数据源的源文件存放位置(.new和.txt文件),此为dic复制的另一个方式,更改录音的时间,两种方式用一种即可,通常用这个 dicTaskFile=/data/iflytek/vie62/msm/dicTask/ #复制成功的文件存放位置(.new和.txt文件),此处可以改为dic的探测目录 dicCreateFile=/data/iflytek/vie62/msm/EPCTask/sender/ #对源文件翻倍多少倍 dicCreateNum=2 #翻倍的数据年份 createYearNum=2018 #翻倍的数据月份 createMonthNum=12
二、翻倍的实现:
#!/bin/sh ###################### # 任务翻倍脚本 # 20190216 # wjlv2@iflytek.com ###################### ## 生成随机不重复值 function suijizhi(){ ## 生成n个随机数到.tempp文件中 rm -rf .tempp i=0 while [ ${i} -lt $epcCreateNum ] do echo `tr -cd a-zA-Z0-9 </dev/urandom | head -c 12` >> .tempp let "i+=1" done echo '['$(date "+%Y-%m-%d %R:%S")'] 随机数已生成...' } ## 初始化参数 function chushihua(){ echo '['$(date "+%Y-%m-%d %R:%S")'] ########### 开始初始化 ###########' ## 当前脚本所在目录 workdir=$(cd $(dirname $0); pwd) ## 删除fuzhi函数备份到当前目录的txt文件 rm -rf *txt if [ -d bak ];then echo '['$(date "+%Y-%m-%d %R:%S")'] 生成原始电话信息文件备份目录 ...' else mkdir bak fi ## 取配置文件中的相关目录位置 epcTaskFile=`cat ./config.ini|grep epcTaskFile|grep -v "#"|awk -F '=' '{print $2}'` epcTaskVoice=`cat ./config.ini|grep epcTaskVoice|grep -v "#"|awk -F '=' '{print $2}'` epcCreateFile=`cat ./config.ini|grep epcCreateFile|grep -v "#"|awk -F '=' '{print $2}'` epcCreateNum=`cat ./config.ini|grep epcCreateNum|grep -v "#"|awk -F '=' '{print $2}'` epcNonFile=`cat ./config.ini|grep epcNonFile|grep -v "#"|awk -F '=' '{print $2}'` epcVoiceId=`cat ./config.ini|grep epcVoiceId|grep -v "#"|awk -F '=' '{print $2}'` voiceId_lie=`cat ./config.ini|grep voiceId_lie|grep -v "#"|awk -F '=' '{print $2}'` epcVoiceUri=`cat ./config.ini|grep epcVoiceUri|grep -v "#"|awk -F '=' '{print $2}'` voiceUri_lie=`cat ./config.ini|grep voiceUri_lie|grep -v "#"|awk -F '=' '{print $2}'` rmDownVoice=`cat ./config.ini|grep rmDownVoice|grep -v "#"|awk -F '=' '{print $2}'` :<<! echo 'epcTaskFile : '$epcTaskFile echo 'epcTaskVoice : '$epcTaskVoice echo 'epcCreateFile :'$epcCreateFile echo 'epcCreateNum : '$epcCreateNum echo 'epcNonFile : '$epcNonFile ! ## 判断配置路径是否正确 if [ `find $epcTaskFile -name 'DHXX_*_*_*txt'|wc -l` == 0 ];then echo '请检查epc待翻倍目录 '$epcTaskFile' 下是否有电话信息文件' exit 0 elif [ $epcCreateNum -lt 1 ];then echo '翻倍数不能小于1!' exit 0 else echo '['$(date "+%Y-%m-%d %R:%S")'] 已找到电话信息文件' echo '['$(date "+%Y-%m-%d %R:%S")'] 每次复制文件数为:'$epcCreateNum if [ 'ABC'$epcTaskVoice == 'ABC' ];then echo '['$(date "+%Y-%m-%d %R:%S")'] 音频位置:FTP' ## 远程下载标志,默认为true isHbyd=true ## 判断是否需要删除已下载且转码后的音频文件(节省服务器磁盘空间) if [[ 'abab'$rmDownVoice == 'ababfalse' ]];then echo '['$(date "+%Y-%m-%d %R:%S")'] 删除远程下载已转码音频:否' else echo '['$(date "+%Y-%m-%d %R:%S")'] 删除远程下载已转码音频:是' fi else echo '['$(date "+%Y-%m-%d %R:%S")'] 音频位置:本地' isHbyd=false ## 删除临时目录 rm -rf $epcCreateFile/voice_temp rm -rf .voice ##################如果找不到音频可能只是因为音频不是V3格式的,可以在这里修改查找的文件后缀名####################### if [ `find $epcTaskFile -name *V3|wc -l` == 0 ];then echo '请检查epc待翻倍目录 '$epcTaskFile' 下是否有录音文件' exit 0 fi echo '['$(date "+%Y-%m-%d %R:%S")'] 已找到本地录音,开始复制到指定目录 ...' ## 找到音频目录下的音频,统一移动到指定目录 find ${epcTaskVoice} -name '*.V3' >> .voice mkdir -p $epcCreateFile/voice_temp cat .voice|while read voice_file do cp $voice_file $epcCreateFile/voice_temp/ done echo '['$(date "+%Y-%m-%d %R:%S")'] 本地录音复制完成~' fi fi echo '['$(date "+%Y-%m-%d %R:%S")'] ########### 初始化完成 ############' } ## 找到电话信息文件,并且修改流水号 function fuzhi(){ ## 查找电话信息文件(取最新的电话信息文件,作为基础模版复制) ## jcmb 基础模板,即电话信息文件DHXX_0_XXX.txt ## jcmc 基础名称,即电话信息文件夹 jcmb=`find ${epcTaskFile} -name 'DHXX*txt' -exec ls -tr {} \;|head -1` echo '基础模板为:'$jcmb cp $jcmb ./ ## 此处的line为.tempp文件的行 jcmc=`ls DHXX*txt|awk -F'.txt|_' '{print $1"_"$2"_"$3"_'$line'_"$5}'` ## 备份基础模版电话信息 echo '基础名称为:'$jcmc mv *txt bak ## 生成随机文件对应的目录,并拷贝基础模板到对应文件夹 :<<! mkdir -p $epcCreateFile/$jcmc cp $jcmb $epcCreateFile/$jcmc/$jcmc.txt touch $epcCreateFile/$jcmc/$jcmc.new file=$epcCreateFile/$jcmc/$jcmc.txt ! cp $jcmb $epcCreateFile/$jcmc.txt file=$epcCreateFile/$jcmc.txt echo '['$(date "+%Y-%m-%d %R:%S")'] 复制文件 :'$jcmc xiugailie touch $epcCreateFile/$jcmc.new } ## 修改电话信息文件的某列(这里修改的是流水号voiceid) function xiugailie(){ ## 删除临时文件 rm -rf .voiceId_liee ## 此处的file为fuzhi中的文件 cat $file|tail -n +2|awk -F'|' '{print $'$voiceId_lie'}' > .voiceId_liee cat .voiceId_liee|while read voiceId_liee_lie do sed -i 's/'$voiceId_liee_lie'/'${line:0:6}''$voiceId_liee_lie'/' $file done echo '['$(date "+%Y-%m-%d %R:%S")'] 已完成 :'$jcmc'.txt 流水号修改 ...' ## 如果为本地方式则修改电话信息文件的音频目录为探测目录下的voice_temp目录 if [ 'abab'$isHbyd == 'ababfalse' ];then rm -rf .voiceUri_liee ## 考虑到音频路径含有:或者/下方替换时sed命令出错,所以处理前就把所有的/替换为: sed -i 's/\//:/g' $file cat $file|tail -n +2|awk -F'|' '{print $'$voiceUri_lie'}' > .voiceUri_liee cat .voiceUri_liee|while read voiceUri_liee_lie do v3=`echo $voiceUri_liee_lie|awk -F':' '{print $NF}'` #sed -i 's/'$voiceUri_liee_lie'/..\/voice_temp\/'$v3'/' $file sed -i 's/'$voiceUri_liee_lie'/voice_temp\/'$v3'/' $file done echo '['$(date "+%Y-%m-%d %R:%S")'] 已完成 :'$jcmc'.txt 音频路径修改 ...' fi } ## epc是否处于空闲任务状态 function epcRun(){ ## 查找epc任务处理的batch目录下是否有任务文件 ## name为epc待处理batch目录下的文件名(不带后缀) #rm -rf .nam_Txt nam_Txt=`find $epcNonFile -maxdepth 1 -name '*txt' -exec ls -tr {} \;|awk -F'/' '{print $NF}'|head -1|awk -F'.' '{print $1}'` #nam_Txt=`cat .nam_Txt` #echo $nam_Txt #rm -rf .nam_New nam_New=`find $epcNonFile -maxdepth 1 -name '*new' -exec ls -tr {} \;|awk -F'/' '{print $NF}'|head -1|awk -F'.' '{print $1}'` #nam_New=`cat .nam_New` #echo $nam_New ## 找到是否有存在txt和new文件 epcRunFlag=false if [[ -f $epcNonFile/$nam_Txt.txt && -f $epcNonFile/$nam_Txt.new ]];then epcRunFlag=true elif [[ -f $epcNonFile/$nam_New.txt && -f $epcNonFile/$nam_New.new ]];then epcRunFlag=true fi } ## 若音频为FTP方式,是否需要删除已下载且转码转写完成的音频以节省磁盘空间 function rmDownVoice(){ ## 判断是否需要删除转写完成后的音频文件 if [[ 'abab'$rmDownVoice != 'ababfalse' ]];then #echo '['$(date "+%Y-%m-%d %R:%S")'] 检查 '$epcNonFile'/../trans/下是否有新生成转码后的音频' if [ `ls -F $epcNonFile/../trans/|wc -l` -gt 1 ];then cd $epcNonFile/../trans/ echo "["$(date "+%Y-%m-%d %R:%S")"] $epcNonFile/../trans/"`ls -tr|head -1`" 已转写完成,正在删除 ..." rm -rf `ls -tr $epcNonFile/../trans/|head -1` :<<! cd $epcNonFile/../voice/ echo "["$(date "+%Y-%m-%d %R:%S")"] $epcNonFile/../voice/"`ls -tr|head -1`" 已转码完成,正在删除 ..." rm -rf `ls -tr $epcNonFile/../voice/|head -1` cd $workdir ! else echo "["$(date "+%Y-%m-%d %R:%S")"] 未找到转写完成的音频,暂时无需删除 ~" fi if [ `ls -F $epcNonFile/../voice/|wc -l` -gt 1 ];then cd $epcNonFile/../voice/ echo "["$(date "+%Y-%m-%d %R:%S")"] $epcNonFile/../voice/"`ls -tr|head -1`" 已转码完成,正在删除 ..." rm -rf `ls -tr $epcNonFile/../voice/|head -1` cd $workdir else echo "["$(date "+%Y-%m-%d %R:%S")"] 未找到转码完成的音频,暂时无需删除 ~" fi fi } ## main epc epc(){ chushihua while true do epcRun if [[ 'abab'$epcRunFlag == 'ababfalse' ]];then echo '['$(date "+%Y-%m-%d %R:%S")'] epc任务处理完成,开始任务复制~' suijizhi cat .tempp|while read line do fuzhi done else echo '['$(date "+%Y-%m-%d %R:%S")'] epc任务处理中,暂不复制~' fi ## 判断是否要删除转写完成的音频以节省空间 rmDownVoice ############ 此处可修改复制检测时间间隔,1分钟:1m 1秒钟:1s 尽量不要低于30s ############## sleep 30s done } ########epc翻倍任务已经注释掉了####### #epc ## dic翻倍 dic_chushihua(){ echo '['$(date "+%Y-%m-%d %R:%S")'] ########### 开始DIC翻倍初始化 ###########' workdir=$(cd $(dirname $0); pwd) dicTaskFile=`cat ./config.ini|grep dicTaskFile|grep -v "#"|awk -F '=' '{print $2}'` dicCreateFile=`cat ./config.ini|grep dicCreateFile|grep -v "#"|awk -F '=' '{print $2}'` dicCreateNum=`cat ./config.ini|grep dicCreateNum|grep -v "#"|awk -F '=' '{print $2}'` createYearNum=`cat ./config.ini|grep createYearNum|grep -v "#"|awk -F '=' '{print $2}'` createMonthNum=`cat ./config.ini|grep createMonthNum|grep -v "#"|awk -F '=' '{print $2}'` if [ `find $dicTaskFile -name 'dps*_*_*_*txt'|wc -l` == 0 ];then echo '请检查epc待翻倍目录 '$dicTaskFile' 下是否有电话信息文件' exit 0 elif [ $dicCreateNum -lt 1 ];then echo '翻倍数不能小于1!' exit 0 else # echo '['$(date "+%Y-%m-%d %R:%S")'] 已找到待翻倍文件' echo '['$(date "+%Y-%m-%d %R:%S")'] 每次复制文件数为:'$dicCreateNum fi echo '['$(date "+%Y-%m-%d %R:%S")'] ########### DIC初始化完成 ############' } function dic_suijizhi(){ ## 生成n个随机数到.tempp文件中 rm -rf .dic_tempp i=0 while [ ${i} -lt $dicCreateNum ] do echo `tr -cd a-zA-Z0-9 </dev/urandom | head -c 12` >> .dic_tempp let "i+=1" done echo '['$(date "+%Y-%m-%d %R:%S")'] 随机数已生成...' } ## main dic dic(){ dic_chushihua while true do dic_suijizhi cat .dic_tempp|while read sjz do rm -rf dps*txt jcmb=`find ${dicTaskFile} -maxdepth 1 -name 'dps*_*_*_*txt' -exec ls -tr {} \;|head -1` cp `find $dicTaskFile -maxdepth 1 -name 'dps*_*_*_*txt'|head -1` ./ jcmc=`ls dps*txt|awk -F'.txt|_' '{print $1"_"$2"_"$3"_'$sjz'_"$5"_"$6}'` mv dps*txt $jcmc.txt echo '['$(date "+%Y-%m-%d %R:%S")'] 基础名称为:'$jcmc timee=`cat $jcmc.txt |awk -F'timeFormat":"|","seatId' '{print $2}'|awk -F'-' '{print $1"-"$2}'` batchidd=`cat $jcmc.txt |awk -F'batchId":"|","dataSourc' '{print $2}'` echo '下面开始替换...' sed -i 's/'$batchidd'/'$sjz'/g' $jcmc.txt & echo '['$(date "+%Y-%m-%d %R:%S")'] 批次号修改完成...' ### 如果不修改年月 注释下方一行即可,配置文件config.ini不用修改 ######## # sed -i 's/'$timee'/'$createYearNum'-'$createMonthNum'/g' $jcmc.txt # echo '['$(date "+%Y-%m-%d %R:%S")'] 来电时间修改完成...' sed -i 's/voiceId":"/voiceId":"123456123456/g' $jcmc.txt & wait sed -i 's/123456123456/'${sjz:0:6}'/g' $jcmc.txt echo '['$(date "+%Y-%m-%d %R:%S")'] 流水号修改完成...' mv $jcmc.txt $dicCreateFile touch $dicCreateFile/$jcmc.new echo '['$(date "+%Y-%m-%d %R:%S")'] 文件复制结束...' done ############ 此处可修改复制检测时间间隔,1分钟:1m 1秒钟:1s 尽量不要低于30s ############## sleep 30s done } dic
翻倍的思路(以epc翻倍为例):
1、初始化读取配置文件的值,
(1)检查是否有固定格式待翻倍的任务文件以及翻倍的倍数
if [ `find $epcTaskFile -name 'DHXX_*_*_*txt'|wc -l` == 0 ];then echo '请检查epc待翻倍目录 '$epcTaskFile' 下是否有电话信息文件' exit 0 elif [ $epcCreateNum -lt 1 ];then echo '翻倍数不能小于1!' exit 0
(2)判断录音文件处理方式是远程还是本地,并初始化处理方式的值。如果是远程,那么下载到本地是否需要删除本地已处理完成的文件
if [ 'ABC'$epcTaskVoice == 'ABC' ];then echo '['$(date "+%Y-%m-%d %R:%S")'] 音频位置:FTP' ## 远程下载标志,默认为true isHbyd=true ## 判断是否需要删除已下载且转码后的音频文件(节省服务器磁盘空间) if [[ 'abab'$rmDownVoice == 'ababfalse' ]];then echo '['$(date "+%Y-%m-%d %R:%S")'] 删除远程下载已转码音频:否' else echo '['$(date "+%Y-%m-%d %R:%S")'] 删除远程下载已转码音频:是' fi else echo '['$(date "+%Y-%m-%d %R:%S")'] 音频位置:本地' isHbyd=false ## 删除临时目录 rm -rf $epcCreateFile/voice_temp rm -rf .voice
(3)如果是本地继续判断目录下是否有音频,并移动到统一的位置
if [ `find $epcTaskFile -name *V3|wc -l` == 0 ];then echo '请检查epc待翻倍目录 '$epcTaskFile' 下是否有录音文件' exit 0 fi echo '['$(date "+%Y-%m-%d %R:%S")'] 已找到本地录音,开始复制到指定目录 ...' ## 找到音频目录下的音频,统一移动到指定目录 find ${epcTaskVoice} -name '*.V3' >> .voice mkdir -p $epcCreateFile/voice_temp cat .voice|while read voice_file do cp $voice_file $epcCreateFile/voice_temp/ done
2、根据读取的配置文件的翻倍数量,生成12位数字字母大小写的随机值suijizhi
function suijizhi(){ ## 生成n个随机数到.tempp文件中 rm -rf .tempp i=0 while [ ${i} -lt $epcCreateNum ] do echo `tr -cd a-zA-Z0-9 </dev/urandom | head -c 12` >> .tempp let "i+=1" done echo '['$(date "+%Y-%m-%d %R:%S")'] 随机数已生成...' }
3、判断epc的运行状态
function epcRun(){ ## 查找epc任务处理的batch目录下是否有任务文件 ## name为epc待处理batch目录下的文件名(不带后缀) #rm -rf .nam_Txt nam_Txt=`find $epcNonFile -maxdepth 1 -name '*txt' -exec ls -tr {} \;|awk -F'/' '{print $NF}'|head -1|awk -F'.' '{print $1}'` #nam_Txt=`cat .nam_Txt` #echo $nam_Txt #rm -rf .nam_New nam_New=`find $epcNonFile -maxdepth 1 -name '*new' -exec ls -tr {} \;|awk -F'/' '{print $NF}'|head -1|awk -F'.' '{print $1}'` #nam_New=`cat .nam_New` #echo $nam_New ## 找到是否有存在txt和new文件 epcRunFlag=false if [[ -f $epcNonFile/$nam_Txt.txt && -f $epcNonFile/$nam_Txt.new ]];then epcRunFlag=true elif [[ -f $epcNonFile/$nam_New.txt && -f $epcNonFile/$nam_New.new ]];then epcRunFlag=true fi }
4、执行复制
function fuzhi(){ ## 查找电话信息文件(取最新的电话信息文件,作为基础模版复制) ## jcmb 基础模板,即电话信息文件DHXX_0_XXX.txt ## jcmc 基础名称,即电话信息文件夹 jcmb=`find ${epcTaskFile} -name 'DHXX*txt' -exec ls -tr {} \;|head -1` echo '基础模板为:'$jcmb cp $jcmb ./ ## 此处的line为.tempp文件的行 jcmc=`ls DHXX*txt|awk -F'.txt|_' '{print $1"_"$2"_"$3"_'$line'_"$5}'` ## 备份基础模版电话信息 echo '基础名称为:'$jcmc mv *txt bak ## 生成随机文件对应的目录,并拷贝基础模板到对应文件夹 :<<! mkdir -p $epcCreateFile/$jcmc cp $jcmb $epcCreateFile/$jcmc/$jcmc.txt touch $epcCreateFile/$jcmc/$jcmc.new file=$epcCreateFile/$jcmc/$jcmc.txt ! cp $jcmb $epcCreateFile/$jcmc.txt file=$epcCreateFile/$jcmc.txt echo '['$(date "+%Y-%m-%d %R:%S")'] 复制文件 :'$jcmc xiugailie touch $epcCreateFile/$jcmc.new }
5、复制需要修改列内容,修改的内容有voiceId和voiceUrl
function xiugailie(){ ## 删除临时文件 rm -rf .voiceId_liee ## 此处的file为fuzhi中的文件 cat $file|tail -n +2|awk -F'|' '{print $'$voiceId_lie'}' > .voiceId_liee cat .voiceId_liee|while read voiceId_liee_lie do sed -i 's/'$voiceId_liee_lie'/'${line:0:6}''$voiceId_liee_lie'/' $file done echo '['$(date "+%Y-%m-%d %R:%S")'] 已完成 :'$jcmc'.txt 流水号修改 ...' ## 如果为本地方式则修改电话信息文件的音频目录为探测目录下的voice_temp目录 if [ 'abab'$isHbyd == 'ababfalse' ];then rm -rf .voiceUri_liee ## 考虑到音频路径含有:或者/下方替换时sed命令出错,所以处理前就把所有的/替换为: sed -i 's/\//:/g' $file cat $file|tail -n +2|awk -F'|' '{print $'$voiceUri_lie'}' > .voiceUri_liee cat .voiceUri_liee|while read voiceUri_liee_lie do v3=`echo $voiceUri_liee_lie|awk -F':' '{print $NF}'` #sed -i 's/'$voiceUri_liee_lie'/..\/voice_temp\/'$v3'/' $file sed -i 's/'$voiceUri_liee_lie'/voice_temp\/'$v3'/' $file done echo '['$(date "+%Y-%m-%d %R:%S")'] 已完成 :'$jcmc'.txt 音频路径修改 ...' fi }
6、若是远程方式实现删除已处理完成的任务文件
function rmDownVoice(){ ## 判断是否需要删除转写完成后的音频文件 if [[ 'abab'$rmDownVoice != 'ababfalse' ]];then #echo '['$(date "+%Y-%m-%d %R:%S")'] 检查 '$epcNonFile'/../trans/下是否有新生成转码后的音频' if [ `ls -F $epcNonFile/../trans/|wc -l` -gt 1 ];then cd $epcNonFile/../trans/ echo "["$(date "+%Y-%m-%d %R:%S")"] $epcNonFile/../trans/"`ls -tr|head -1`" 已转写完成,正在删除 ..." rm -rf `ls -tr $epcNonFile/../trans/|head -1` :<<! cd $epcNonFile/../voice/ echo "["$(date "+%Y-%m-%d %R:%S")"] $epcNonFile/../voice/"`ls -tr|head -1`" 已转码完成,正在删除 ..." rm -rf `ls -tr $epcNonFile/../voice/|head -1` cd $workdir ! else echo "["$(date "+%Y-%m-%d %R:%S")"] 未找到转写完成的音频,暂时无需删除 ~" fi if [ `ls -F $epcNonFile/../voice/|wc -l` -gt 1 ];then cd $epcNonFile/../voice/ echo "["$(date "+%Y-%m-%d %R:%S")"] $epcNonFile/../voice/"`ls -tr|head -1`" 已转码完成,正在删除 ..." rm -rf `ls -tr $epcNonFile/../voice/|head -1` cd $workdir else echo "["$(date "+%Y-%m-%d %R:%S")"] 未找到转码完成的音频,暂时无需删除 ~" fi fi }