当前位置: 技术问答>linux和unix
如何提高下面shell脚本的运行效率?
来源: 互联网 发布时间:2017-01-02
本文导语: 1.功能描述: 导出数据库中tg_cdr08_fix_bak1_1表中seq_no到某个文件,并根据文件中的值,在某个目录下查找出对应的行,并追加到指定的文中。 表tg_cdr08_fix_bak1_1中的数据量为1000万级, ${BOSS_DATA}/user/fix/ticket/hs[a-...
1.功能描述:
导出数据库中tg_cdr08_fix_bak1_1表中seq_no到某个文件,并根据文件中的值,在某个目录下查找出对应的行,并追加到指定的文中。
表tg_cdr08_fix_bak1_1中的数据量为1000万级,
${BOSS_DATA}/user/fix/ticket/hs[a-d]1/voice/VFP18[1-4]_hs_08*_fix_local.txt 由120个文件,共 2000多万行。
2.代码实现:
3. 问题: 我已经无法忍受,因为10分钟后显示0.00%, 本人对shell不熟悉,无法对其进行优化,请高人指点。
导出数据库中tg_cdr08_fix_bak1_1表中seq_no到某个文件,并根据文件中的值,在某个目录下查找出对应的行,并追加到指定的文中。
表tg_cdr08_fix_bak1_1中的数据量为1000万级,
${BOSS_DATA}/user/fix/ticket/hs[a-d]1/voice/VFP18[1-4]_hs_08*_fix_local.txt 由120个文件,共 2000多万行。
2.代码实现:
cd ${BOSS_HOME}/billdata/user/heyj/shell/errTicketSeqNo
read exportFilename?"filename(eg: fix_seqno.txt): "
rm -rf *
#touch ${exportFilename}
echo "export data..."
output=`sqlplus ucr_hsd/ucr_hsd@bil ./${exportFilename}
rm -rf temp.txt
# delete last line
sed '$d' ./${exportFilename} >./temp.txt
rm -rf ${exportFilename}
cp temp.txt ${exportFilename}
rm -rf temp.txt
echo "export data ok"!
echo "get ticket ..."
# count ${exportFilename} lines
count=0
for j in $( awk '{print $1}' ${exportFilename} ) ; do
let count+=1;
done
echo "count:$count"
#count=$( wc -l ${exportFilename} | awk '{print $1}' )
i=0
for line in $( awk '{print $1}' ${exportFilename} ) ; do
if [ -n $line ] ; then
grep "${line}" ${BOSS_DATA}/user/fix/ticket/hs[a-d]1/voice/VFP18[1-4]_hs_08*_fix_local.txt >>./ticket_${exportFilename}
fi
let i+=1;
awk 'BEGIN{printf "bbbbbbbb%.2f%",'$i'*100/'$count'}'
#echo $line
done
echo $count
echo $i
echo "^_^ get ticket ok."
echo "ticket file name: ticket_${exportFilename}"
3. 问题: 我已经无法忍受,因为10分钟后显示0.00%, 本人对shell不熟悉,无法对其进行优化,请高人指点。
|
2000W的数据量shell靠谱么?就算用脚本也应该perl吧
用C写倒是几十秒钟的事情
用C写倒是几十秒钟的事情
|
可以考虑用c写个多线程程序,多线程调用shell脚本,并把大文件分成多个小文件处理。合并结果。
|
跑了10分钟后,你查看一下跑出的结果是否正常,脚本写错了没法优化了。
|
需要高效率的情况 拿shell处理就是不明智的 至少也得用perl python一类的脚本语言