免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1504 | 回复: 7
打印 上一主题 下一主题

[文本处理] awk 分解文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-10-18 22:31 |只看该作者 |倒序浏览
本帖最后由 ljmmail 于 2017-10-18 22:35 编辑

如何使用 awk 分析以下数据,按照指定标志分解文件

@@@@@<<<<<  为新文件开始标志,后面紧跟着文件名称
#####>>>>> 为文件结束标志
最后分解为
./ftt
./pfhsm/include/kmSpier.h

  1. @@@@@<<<<< ./ftt BEGIN (17)LINES @@@@@<<<<<
  2. FBZ="@@@@@<<<<<"
  3. HBZ="#####>>>>>"
  4. FNUM=0
  5. FCNT=0

  6. for  t in ` find . -type f `
  7. do
  8. fwcl=`wc -l $t | awk '{print $1}'`
  9. echo "$FBZ $t BEGIN ($fwcl)LINES $FBZ"
  10. cat  $t
  11. echo "$HBZ $t END ($fwcl)LINES $HBZ"
  12. FNUM=`expr $FNUM + 1 `
  13. FCNT=`expr $FCNT + $fwcl `
  14. done

  15. echo "$HBZ 共 $FNUM 文件, $FCNT 行 $HNZ"
  16. echo "\n\n"
  17. #####>>>>> ./ftt END (17)LINES #####>>>>>
  18. @@@@@<<<<< ./pfhsm/include/kmSpier.h BEGIN (26)LINES @@@@@<<<<<
  19. //    Author:    Wolfgang Wang
  20. //    Date:    2003/09/02

  21. // 为UP-2003-04-13开发

  22. #ifndef _UnionKMSpierSpier_
  23. #define _UnionKMSpierSpier_

  24. #include "appKMSvr.h"
  25. #include "idOfApp.h"

  26. typedef struct
  27. {
  28.         char    requestOrResponse;    // 请求还是响应,1表示请求,0表示响应
  29.         char    idOfApp[2];        // 应用标识,应用固定为80
  30.         char    idOfOperation[2];    // 操作标识,参见:appKMSvr.h的定义
  31.         char    errCode[6];        // 错误码,操作产生
  32. } TUnionKMSpierHeader;
  33. typedef TUnionKMSpierHeader    *PUnionKMSpierHeader;

  34. int UnionSpyKMRequest(char *idOfOperation,char *reqStr,int len);
  35. int UnionSpyKMResponse(char *idOfOperation,char *errCode,char *resStr,int len);
  36. int UnionUnpackKMSpierPackage(char *pck,int lenOfPck,PUnionKMSpierHeader pheader,char *buf,int sizeOfBuf);
  37. int UnionAnalysisKMSpierPackage(char *pck,int lenOfPck,char *reqOrRes,char *oper,char *errCode,char *buf,int sizeOfBuf);

  38. #endif
  39. #####>>>>> ./pfhsm/include/kmSpier.h END (26)LINES #####>>>>>
复制代码

论坛徽章:
0
2 [报告]
发表于 2017-10-18 22:33 |只看该作者
注意文件 名称中带有路径信息,可能需要创建目录

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
3 [报告]
发表于 2017-10-18 23:13 |只看该作者
回复 2# ljmmail

$ awk 'match($0,"^@@@@@<<<<< ([^ ]+)",m){f=m[1];s="";next}/^#####>>>>> /{print "file:"f;cmd="mkdir -p `dirname "f"`";system(cmd);printf("%s",s)>f;next}{s=s$0"\n"}' FILE
file:./ftt
file:./pfhsm/include/kmSpier.h

$ wc ./ftt
17  56 313 ./ftt

$ wc ./pfhsm/include/kmSpier.h
26  69 971 ./pfhsm/include/kmSpier.h

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
4 [报告]
发表于 2017-10-19 12:21 |只看该作者
回复 1# ljmmail


  1. awk '/^@@@@@<<<<<.*@@@@@<<<<<$/{a="";split($0,s);dir=gensub("[^/]+$","","1",s[2]);system("mkdir -p "dir"")}{a=a?a"\n"$0:$0}/^#####>>>>>.*#####>>>>>$/{print a>s[2];a=""}' file
复制代码

论坛徽章:
0
5 [报告]
发表于 2017-10-20 12:08 |只看该作者
谢谢 jason680 回复,这个方法确实可用。

论坛徽章:
0
6 [报告]
发表于 2017-10-20 15:57 |只看该作者
  1. awk '
  2.         BEGIN { mpath=""; npath="";}
  3.         ## 对文件开始标志行处理,获取文件名称,判断文件夹没出现过,则建立子目录
  4.         { if ($0 ~ /^@@@@@<<<<</) {
  5.                 split($0,s); f=substr(s[2], 3);
  6.                 npath=gensub("[^/]+$","","1",s[2])
  7.                 if(npath != mpath) { cmd="mkdir -p "npath" "; system(cmd); mpath=npath; }
  8.                 icnt=0; buf=""; next}
  9.         }
  10.         ## 对文件结束标志处理,输出缓冲区数据,打印提示信息
  11.         { if ($0 ~ /^#####<<<<</) { print "create :-> " f; printf("%s",buf)>f;next}}
  12.        
  13.         ## 正常数据行,追加新数据到缓冲区中,并计算行数
  14.         { buf=buf$0"\n"; icnt = icnt + 1; }
  15.         ## 缓冲区中有 64 上时,完成一次数据输出
  16.         { if(icnt==64) { printf("%s",buf)>f; buf=""; icnt = 0; }}

  17. '  filename
复制代码


这是一个整理后的处理脚本,增加了一些特效,程序效率很高

论坛徽章:
0
7 [报告]
发表于 2017-10-20 15:58 |只看该作者
  1. awk '
  2.         BEGIN { mpath=""; npath="";}
  3.         ## 对文件开始标志行处理,获取文件名称,判断文件夹没出现过,则建立子目录
  4.         { if ($0 ~ /^@@@@@<<<<</) {
  5.                 split($0,s); f=substr(s[2], 3);
  6.                 npath=gensub("[^/]+$","","1",s[2])
  7.                 if(npath != mpath) { cmd="mkdir -p "npath" "; system(cmd); mpath=npath; }
  8.                 icnt=0; buf=""; next}
  9.         }
  10.         ## 对文件结束标志处理,输出缓冲区数据,打印提示信息
  11.         { if ($0 ~ /^#####<<<<</) { print "create :-> " f; printf("%s",buf)>f;next}}
  12.        
  13.         ## 正常数据行,追加新数据到缓冲区中,并计算行数
  14.         { buf=buf$0"\n"; icnt = icnt + 1; }
  15.         ## 缓冲区中有 64 上时,完成一次数据输出
  16.         { if(icnt==64) { printf("%s",buf)>f; buf=""; icnt = 0; }}

  17. '
复制代码
这是整理后的脚本,增加了一些特效,处理效率很高。

论坛徽章:
8
CU十四周年纪念徽章
日期:2017-08-28 17:16:1915-16赛季CBA联赛之北控
日期:2018-03-29 11:39:0615-16赛季CBA联赛之上海
日期:2018-05-21 10:46:10技术图书徽章
日期:2018-09-03 13:54:18技术图书徽章
日期:2018-09-03 13:54:2815-16赛季CBA联赛之四川
日期:2020-10-15 09:21:4720周年集字徽章-20	
日期:2020-10-28 13:53:0220周年集字徽章-庆
日期:2020-10-28 14:09:12
8 [报告]
发表于 2017-10-24 13:57 |只看该作者
  1. awk '/@@@@@<<<<<.*@@@@@<<<<</{match($0,"@@@@@<<<<< (.*) BEGIN.*@@@@@<<<<<",a) ; p=1 ; next }/#####>>>>>.*#####>>>>>/{p=0}{if(p==1) print $0 > a[1]}' urfile
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP