SHELL脚本之awk妙用
2017-10-19 17:34
197 查看
对于一个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/[/code]
最开始不知道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}
相关文章推荐
- shell脚本awk, sed, cut的妙用
- Linux学习-高级shell脚本编程(一)函数的妙用
- Shell脚本之awk详解
- 踩过的几个坑json.dumps/含while的shell脚本/awk~
- shell脚本-awk
- 【shell脚本】常用工具的学习grep、sed、awk、cut
- AWK与SHELL脚本中对指定日期处理的异常情况
- 如何在shell脚本文件中获取awk的值, 存于变量中?
- shell awk实现实时监控网卡流量脚本(常见应用二)
- Linux基本功十三:shell脚本Sed & Awk 及软件的安装
- shell脚本---grep、awk、sed工具
- sed && awk工具 及一些常用的shell脚本
- shell脚本,用awk实现替换文件里面的内容。
- Shell脚本之awk基础语法
- shell中以-f的方式调用awk脚本
- shell脚本学习笔记(三)—— if、xargs、awk
- 如何在shell脚本里传递一个变量给awk
- Shell脚本学习笔记(七)--sed和awk
- shell脚本之正则表达式、函数、grep、sed、awk、printf等基本命令配置详解
- Shell 脚本学习之awk