SHELL脚本之awk妙用

假装没事ソ 提交于 2020-04-07 08:18:43

对于一个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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!