問題:要對一個幾G,幾千萬行的檔案進行預先處理。
功能:將一個檔案中記錄按一定的規則分割進不同的檔案。
優點:用shell指令碼做文本處理真的很方便,寥寥數行,啥都搞定了,如果用其它進階語言寫,指不定得寫多久。
缺點:單進程單線程做文本分割,耗時可能會很長。
在本例中,需處理的文本記錄的格式為:
fore@forest:~/work/ftr_m2_work/search/periphery/FullIndex/script$ more ./testawk.txt<br />fileID1userIDstorageID2010-10-10 09:00filename1filesizefsha<br />fileID2userIDstorageID2010-10-13 09:00filename2filesizefsha<br />
代碼:
#! /bin/bash<br />#<br />#Author: Fore<br /># Date: 2010.10.13<br />#Description : divide the records of a file into different files by date.<br />#<br />#set -x;<br />if [ $# -ne 1 ]; then<br />echo "./devideByDay.sh /dataFilePath/"<br />exit 0<br />fi<br />if [ -f $1 ]; then<br />midDir="./mid/"<br />rm -rf $midDir<br />mkdir -p $midDir</p><p>logDir="/data/logs/ftr/fullindex/"<br />mkdir -p $logDir<br />logPath=$logDir"divide.log"</p><p>i=0<br />cat $1 | while read line<br />do<br />echo $line | cut -d/ -f4 > tmp<br />cat tmp | while read dateline<br />do<br />echo $line >> $midDir$dateline<br />done</p><p>left=`expr $i % 500`<br />if [ $left -eq 0 ]; then<br />echo `date ` " "$left >> $logPath<br />fi </p><p>i=`expr $i + 1`<br />done<br />else<br />echo $1 " does not exist!"<br />fi
輸出:
fore@forest:~/work/ftr_m2_work/search/periphery/FullIndex/s<br />-rw-r--r-- 1 fore fore 66 2010-10-13 16:42 ./mid/2010-10-10<br />-rw-r--r-- 1 fore fore 66 2010-10-13 16:42 ./mid/2010-10-13<br />