zoukankan      html  css  js  c++  java
  • Shell拆分大文件

    需求:由于文件过大,不方便进行相关的操作,需要将其拆分成大小小于500000B,即488.28125k的文件。同时,为了保证文件的可读性,行内不可以分割,同时,由于内容是块状可读,按照日期进行分割的,因此不能破坏块状因素。例如,db2diag.log日志文件,其格式如下:

    2004-10-11-19.01.56.555034-300 I7109918C313 LEVEL: Event 
    PID : 119664 TID : 1 PROC : db2star2 
    INSTANCE: dimi NODE : 000 
    FUNCTION: DB2 UDB, config/install, sqlfLogUpdateCfgParam, probe:30 
    CHANGE : CFG DBM: "Instance_Memory" <automatic> From: "11126" To: "11126" 

    所以在拆分过程中,不能破坏其可读性。

    一. 研究使用split命令,split [-blC] file PREFIX

    参数: -b 后面可接欲分割成的文件大小,可加单位b,k,m等。但是只是按照大小进行拆分,行内或者某个单词也会被拆开。split -b 488k filename prefix

             -l  后面根据行数来进行分割,这样可以保证行内不被切割,但是不能保证块内不被切割。而且由于行中的字符数不确定,因此导致行书切割也不确定。 split -l 10 filename prefix

             -C 与-b类似,也是指定字节数,但是切割时尽量维持每行的完整性。split -C 488k filename prefix

             PREFIX  代表前导符,可作为切割文件的前导文字

    二.awk命令

    awk -v prefix=$2 'BEGIN {bitNum=0; i=0} {if (length($0) != 0){bitNum+=length($0); print $0 > prefix i;}else{if(bitNum > 480000){i++; bitNum=length($0); print $0 > prefix i} else{bitNum+=length($0); print $0 > prefix i;}}}' $filename

    其中prefix是用户传入的变量名,为了能在后面的处理中使用,使用-v声明

    BEGIN用来初始化变量;记录以空行即length($0)为分割;bitNum用来记录已经出现了多少个字符,i用来记录是存储到第几个文件中(小文件名)

    参考: http://bbs.chinaunix.net/thread-4124134-1-1.html

    awk内置字符串: http://bbs.chinaunix.net/thread-1697027-1-1.html

  • 相关阅读:
    了解Django之前
    jQuery
    java模板模式项目中使用--封装一个http请求工具类
    spring boot项目配置RestTemplate超时时长
    TortoiseSVN-1.7.12.24070-x64-svn-1.7.9安装包和汉化包
    ubuntu16.04环境下在docker上部署javaweb项目简单案例
    工厂模式
    面向对象第四次博客
    面向对象第三次作业总结
    oo第二次博客
  • 原文地址:https://www.cnblogs.com/fengxm/p/4092322.html
Copyright © 2011-2022 走看看