對於處理百萬級別以上的數據,提供三個方法對比:
方法一大約耗時25分鐘(for循環)
方法二大約耗時7分鐘(for循環)
方法三大約耗時10秒(awk工具)
現在有個文本,裏面數據是日-月-年,如下:
任務就是將上面的日期轉換成YYMMDD格式。
例如第一個的17-MAR-20,則是轉換成20200317
那麼需求就很簡單了,將中間的英文提取轉換成數字月份,然後重新排列組合就行了。
轉換後的結果:
方法一:
代碼如下:
for tmp in `cat file |awk -F '[,]' '{print $3}' `;
do
month=`echo $tmp|awk -F '[-]' '{print $2}'`
#echo $month
case $month in
JAN|Jan|jan)
echo $tmp|awk -F '[-]' '{print 20$(3)01$1}'>>file_new
;;
FEB|Feb|feb)
echo $tmp|awk -F '[-]' '{print 20$(3)02$1}'>>file_new
;;
MAR|Mar|may)
echo $tmp|awk -F '[-]' '{print 20$(3)03$1}'>>file_new
;;
APR|Apr|apr)
echo $tmp|awk -F '[-]' '{print 20$(3)04$1}'>>file_new
;;
MAY|May|may)
echo $tmp|awk -F '[-]' '{print 20$(3)05$1}'>>file_new
;;
JUN|Jun|jun)
echo $tmp|awk -F '[-]' '{print 20$(3)06$1}'>>file_new
;;
JUL|Jul|jul)
echo $tmp|awk -F '[-]' '{print 20$(3)07$1}'>>file_new
;;
AUG|Aug|aug)
echo $tmp|awk -F '[-]' '{print 20$(3)08$1}'>>file_new
;;
SEP|Sep|sep)
echo $tmp|awk -F '[-]' '{print 20$(3)09$1}'>>file_new
;;
OCT|Oct|oct)
echo $tmp|awk -F '[-]' '{print 20$(3)10$1}'>>file_new
;;
NOV|Nov|nov)
echo $tmp|awk -F '[-]' '{print 20$(3)11$1}'>>file_new
;;
DEC|Dec|dec)
echo $tmp|awk -F '[-]' '{print 20$(3)12$1}'>>file_new
;;
esac
done
有一個問題就是,上面的這樣轉換效率不快,1M的文本轉換要接近10多甚至20分鐘!
當然如果是小文本就無所謂了,我接觸的數據基本都是百萬級別的,就很尷尬。
這個效率問題還沒想好要怎麼去解決,以後如有辦法解決效率問題再更新、。
······############################################·····
方法二
更新一下方法,下面這個方法處理百萬級別的數據要7分鐘左右:
for tmp in `cat file |awk -F '[,]' '{print $3}' `;
do
date "+%Y%m%d" -d $tmp >> test.txt
done
這方法對於超過M級別的數據也是不行的,不符合大數據處理思想。
方法三
用awk處理就很快,大概10多秒就可以了。
awk是個強大的工具~
方法如下:
#直接使用gsub函數替換掉MAR成03,這種方法速度極快(1、2秒就能處理完畢),其它月份也是同樣處理
awk '{gsub(/JAN/,"01")}1' u_file_nane > $name.tmp0
awk '{gsub(/FEB/,"02")}1' $name.tmp0 > $name.tmp1
awk '{gsub(/MAR/,"03")}1' $name.tmp1 > $name.tmp0
awk '{gsub(/APR/,"04")}1' $name.tmp0 > $name.tmp1
awk '{gsub(/MAY/,"05")}1' $name.tmp1 > $name.tmp0
awk '{gsub(/JUN/,"06")}1' $name.tmp0 > $name.tmp1
awk '{gsub(/JUL/,"07")}1' $name.tmp1 > $name.tmp0
awk '{gsub(/AUG/,"08")}1' $name.tmp0 > $name.tmp1
awk '{gsub(/SEP/,"09")}1' $name.tmp1 > $name.tmp0
awk '{gsub(/OCT/,"10")}1' $name.tmp0 > $name.tmp1
awk '{gsub(/NOV/,"11")}1' $name.tmp1 > $name.tmp0
awk '{gsub(/DEC/,"12")}1' $name.tmp0 > $name.tmp1
#把十二個月份的都替換完成,那麼數據就由17-MAR-20轉換成17-03-20
#再對17-03-20排列組合就OK了
cat $name.tmp1|awk -F ‘[-]’ '{print 20$3$2$1}' > date.txt
#date.txt的文本格式就是YYMMDD的了,即 17-MAR-20 轉換成了 20200317