shell 月份英數格式轉換,月份英文轉換成數字

對於處理百萬級別以上的數據,提供三個方法對比:
方法一大約耗時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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章