• 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 '	' '{print $0"	"substr($1,0,4)"	"substr($1,4,2)"	"substr($1,6,2)"	"substr($1,8,2)}' $infile > $outfile

    行处理的方式提高了效率,同时让逻辑更加清楚。空余时间还是要加强Linux的命令学习

    awk语法详见:{点击这里:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html

  • 相关阅读:
    eureka 注册中心(单机版)
    金蝶实际成本培训01
    查看WIN10内核
    金蝶K3 WISE 15.0 GUID
    win10卸载系统自带office365
    金蝶K3wise15.0BOM维护默认只能查看登录账户作为建立人的BOM清单
    阿里云邮箱代收邮件
    金蝶寄售业务流程
    转-商品流通企业代销商品核算方法
    转-ERP待检仓、代管仓、赠品仓
  • 原文地址:https://www.cnblogs.com/tianxia2s/p/7693765.html
Copyright © 2020-2023  润新知