SHELL脚本之awk妙用
对于一个sougou文本文件,解压后大概4G,要求在其基础上切出第一列时间年月日时分秒增加在列中,作为hive的一个索引。先将文件head一下展示格式:
[root@Master date]# head -n 5 sogou.full.utf8 20111230000005 57375476989eea12893c0c3811607bcf 奇艺高清 1 1 http://www.qiyi.com/ 20111230000005 66c5bb7774e31d0a22278249b26bc83a 凡人修仙传 3 1 http://www.booksky.org/BookDetail.aspx?BookID=1050804&Level=1 20111230000007 b97920521c78de70ac38e3713f524b50 本本联盟 1 1 http://www.bblianmeng.com/ 20111230000008 6961d0c97fe93701fc9c0d861d096cd9 华南师范大学图书馆 1 1 http://lib.scnu.edu.cn/ 20111230000008 f2f5a21c764aebde1e8afcc2871e086f 在线代理 2 1 http://proxyie.cn/
最开始不知道awk这个命令,就单独切出很多临时文件最后通过paste命令将所有文件拼接起来,小文件测试成功,最后大文件报错说空间不够,跑了一半然后停了
#!/bin/bash cat $1 | cut -b 1-4 > year.txt cat $1 | cut -b 5-6 > mouth.txt cat $1 | cut -b 7-8 > day.txt cat $1 | cut -b 9-10 > hour.txt cat $1 | cut -b 11-12 > min.txt cat $1 | cut -b 13-14 > sec.txt paste year.txt mouth.txt day.txt hour.txt min.txt sec.txt $1 >$2 rm -f year.txt rm -f mouth.txt rm -f day.txt rm -f hour.txt rm -f min.txt rm -f sec.txt
主要原因是每次读取整个文件但是仅仅只是切出一小部分,同时中间变量通过临时文件的方式保存。这样子不仅仅增加了io时间,也减少了处理效率。
而后使用awk命令,命令是按行读取处理的。Linux博大精深,仅仅一个awk就是一个单独的编程语言,免去了跳转到其他脚本处理的麻烦(R或者Python)
#!/bin/bash infile=$1 outfile=$2 awk -F '\t' '{print $0"\t"substr($1,0,4)"\t"substr($1,4,2)"\t"substr($1,6,2)"\t"substr($1,8,2)}' $infile > $outfile
行处理的方式提高了效率,同时让逻辑更加清楚。空余时间还是要加强Linux的命令学习
awk语法详见:{点击这里:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html}
我要坚持一年,一年后的成功才是我想要的。