免费注册 查看新帖 |

Chinaunix

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

请教SHELL处理多个文件的高效方法(我把整篇文章粘贴为"附件1.txt"了) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-17 19:16 |只看该作者 |倒序浏览
20可用积分
本帖最后由 yqhzh 于 2012-04-18 00:16 编辑

好的,按照建议提供一个最简化例子:

有一行数据

[Virus_2]vfile_location=../AVL/AV6/_20110811/00/001789dcd2a7971780de6e17ea6a043b<>vfile_size=1712640<>virus_id=001789dcd2a7971780de6e17ea6a043b<>vfile_type=.exe<>platform=Intel_386<>vfile_create_time=07/26/2011 09:38:20<>packed=<>pack_type/develop_enviroment=<>variant=<>Num_Of_Sections=10<>section_name_1=.text<>section_attri_1=Code<>section_sig_1=1450496:13dc57f1f345db57c95f7dae4ec0943e<>section_name_2=.itext<>section_attri_2=Code<>section_sig_2=5632:3956ef551a960a3329ab4762ff3414b9<>section_name_3=.data<>section_attri_3=Others<>section_sig_3=23552:94b06c9b5a772008a1a74c43f46543fb<>section_name_4=.bss<>section_attri_4=Others<>section_sig_4=0:2547f62c939e2b2a1141006197cb75cc<>section_name_5=.idata<>section_attri_5=Others<>section_sig_5=14848:439ea2610580ed8fd841528471fcd637<>section_name_6=.didata<>section_attri_6=Others<>section_sig_6=1024:59ce6a2442d06738c9b36d6143068d98<>section_name_7=.tls<>section_attri_7=Others<>section_sig_7=0:567f538333cab8399d92974f06bb28ad<>section_name_8=.rdata<>section_attri_8=Others<>section_sig_8=512:220b362c20df1885c3e7757266388994<>section_name_9=.reloc<>section_attri_9=Others<>section_sig_9=133632:008ebd8c03b0fac489e3c95faf2af141<>section_name_10=.rsrc<>section_attri_10=Others<>section_sig_10=81920:fc13eb8c19ee0cabedc45295b5768465<>ep32=558bec83c4d8535633c08945dc8945d88945e48945ec8945e8b878af5500e805<>fent=Unpacked_0<>Num_Of_Vendors=0<>vendor_1=<>virus_name_1=<>virus_type_1=<>virus_report_1=<>

处理该行数据,将该行数据'='后的值分别输出到两个文件。
1,一个文件仅包含一条记录,包含 virus_id, vfile_size, vfile_type字段的值;
格式为:virus_id<>vfile_size<>vfile_type
2,另一个文件包含多条记录,分别为 virus_id, section_name_${i}, section_attri_${i}, section_sig_${i}
其中${i}不确定, i 的值等于Num_Of_Sections
例如 Num_Of_Sections = 3
则输出:
virus_id<>section_name_1<>section_attri_1<>section_sig_1
virus_id<>section_name_2<>section_attri_2<>section_sig_2
virus_id<>section_name_3<>section_attri_3<>section_sig_3



要求效率高,因为有很多很多行。接受方法指点,如果有示例代码更好。多谢了。
全部问题在下面附件中,估计太长了没人看,所以接受建议提供一个简化的例子。

附件1.rar

3.29 KB, 下载次数: 17

帖子的copy

最佳答案

查看完整内容

回复 1# yqhzh

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
2 [报告]
发表于 2012-04-17 19:16 |只看该作者
回复 1# yqhzh

  1. awk '{print gensub(/.*vfile_size=([^<]+)<>virus_id=([^<]+)<>vfile_type=([^<]+).*/,"\\1<>\\2<>\\3",1) >"file1";
  2. virus_id=gensub(/.*virus_id=([^<]+).*/,"\\1",1,$0);
  3. FS="<>section_name_[0-9]+=|<>section_attri_[0-9]+=|<>section_sig_[0-9]+=";
  4. $0=$0;
  5. sub(/<>.*/,"",$NF);for(i=2;i<=NF;i+=3){print virus_id "<>" $i "<>" $(i+1) "<>" $(i+2) >>"file2"}}' file


  6. head file1 file2
  7. ==> file1 <==
  8. 1712640<>001789dcd2a7971780de6e17ea6a043b<>.exe

  9. ==> file2 <==
  10. 001789dcd2a7971780de6e17ea6a043b<>.text<>Code<>1450496:13dc57f1f345db57c95f7dae4ec0943e
  11. 001789dcd2a7971780de6e17ea6a043b<>.itext<>Code<>5632:3956ef551a960a3329ab4762ff3414b9
  12. 001789dcd2a7971780de6e17ea6a043b<>.data<>Others<>23552:94b06c9b5a772008a1a74c43f46543fb
  13. 001789dcd2a7971780de6e17ea6a043b<>.bss<>Others<>0:2547f62c939e2b2a1141006197cb75cc
  14. 001789dcd2a7971780de6e17ea6a043b<>.idata<>Others<>14848:439ea2610580ed8fd841528471fcd637
  15. 001789dcd2a7971780de6e17ea6a043b<>.didata<>Others<>1024:59ce6a2442d06738c9b36d6143068d98
  16. 001789dcd2a7971780de6e17ea6a043b<>.tls<>Others<>0:567f538333cab8399d92974f06bb28ad
  17. 001789dcd2a7971780de6e17ea6a043b<>.rdata<>Others<>512:220b362c20df1885c3e7757266388994
  18. 001789dcd2a7971780de6e17ea6a043b<>.reloc<>Others<>133632:008ebd8c03b0fac489e3c95faf2af141
  19. 001789dcd2a7971780de6e17ea6a043b<>.rsrc<>Others<>81920:fc13eb8c19ee0cabedc45295b5768465

复制代码

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
3 [报告]
发表于 2012-04-17 19:49 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2012-04-17 19:58 |只看该作者
好长好长 弄个简化的例子吧~~~

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
5 [报告]
发表于 2012-04-17 21:05 |只看该作者
awk, perl, python实现起来比较容易。php也可以。

论坛徽章:
0
6 [报告]
发表于 2012-04-18 09:39 |只看该作者
zooyo 发表于 2012-04-17 19:49
长了没人看.


已经修改为最精简模式了

论坛徽章:
0
7 [报告]
发表于 2012-04-18 09:40 |只看该作者
r2007 发表于 2012-04-17 21:05
awk, perl, python实现起来比较容易。php也可以。


我发到SHELL版,当然是来求助AWK的啦

论坛徽章:
0
8 [报告]
发表于 2012-04-18 09:51 |只看该作者
dahaoshanhe 发表于 2012-04-17 19:58
好长好长 弄个简化的例子吧~~~


已经简化,参见一楼,多谢

论坛徽章:
0
9 [报告]
发表于 2012-04-18 10:26 |只看该作者
第一个
  1. awk -F '<>' '{printf $2 "<>" $3 "<>" $4 "<>"}'
复制代码
第二个
  1. num=1
  2. awk -F '<>' '{printf $(8+3*(num)) "<>" $(9+3*(num)) "<>" $(10+3*(num)) }' num=$num > test1.txt
复制代码
如果你的意思是 输入一个n,输出1到n个section的所有的信息
用for循环
  1. num=4
  2. awk -F '<>' '{ for(i=1; i <= num; i++ ) { printf $(8+3*(i)) "<>" $(9+3*(i)) "<>" $(10+3*(i)) "\n" }}' num=$num  > test2.txt
复制代码
刚学习awk~
错了勿拍

论坛徽章:
0
10 [报告]
发表于 2012-04-18 10:53 |只看该作者
xiongweixie 发表于 2012-04-18 10:26
第一个第二个如果你的意思是 输入一个n,输出1到n个section的所有的信息
用for循环刚学习awk~
错了勿拍


因为这些字段在一行中可能排列顺序不定,所以你这里用的指定位置(8+3,9+3.。。。),我想应该是不行的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP