免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: hello|world
打印 上一主题 下一主题

[文本处理] 大文件内容处理,帮忙研究下怎么搞比较好; [复制链接]

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
11 [报告]
发表于 2012-11-07 16:16 |只看该作者
本帖最后由 yestreenstars 于 2012-11-07 16:19 编辑

回复 10# hello|world


    我修改一下

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
12 [报告]
发表于 2012-11-07 21:30 |只看该作者
本帖最后由 yestreenstars 于 2012-11-07 23:55 编辑

想了好久,终于想出来了,但是用来处理大文件效率可能有点低,因为用到了管道,你可以试一下,先用sed修复文本,再通过awk处理文本:
  1. sed '/-$/{N;s/\n//}' 1.txt | awk '/^\[/{for(i in a)if($0~i){if(a[i]!~/1234/&&a[i]~/nn/)print a[i]"\n"$0;if($0!~/1234/&&$0~/nn/)print a[i]"\n"$0};id=gensub(/.*id:([a-z]*).*/,"\\1",1);a[id]=$0}'
复制代码

论坛徽章:
5
未羊
日期:2014-08-04 16:15:21天秤座
日期:2014-08-13 13:52:372015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:112015亚冠之浦和红钻
日期:2015-06-29 15:30:48
13 [报告]
发表于 2012-11-07 22:59 |只看该作者
  1. 描述 yyyy/mm/dd 2010/06/08
  2. [:a:]--------[id:stre]--------[:/a:]

  3. 描述 yyyy/mm/dd 2010/06/08
  4. [:a:]--------[id:sdfa]--------[:/a:]
  5. 描述 yyyy/mm/dd 123123123
  6. [:b:]------
  7. --[id:stre][nn:1300]--------[:/b:]
  8. 描述 yyyy/mm/dd 123123123
  9. [:b:]--------[id:sdfa][nn:1234]--------[:/b:]
复制代码
这段意思是说id:stre的b在下一条id:sdfa里包含着???

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
14 [报告]
发表于 2012-11-10 20:25 |只看该作者
回复 1# hello|world
  1. perl -ne 'if(/(\[:(?:a|b):\].+?\[:\/(?:a|b):\])/ and $1 !~/1234/){print "$1\n"};if(/(.*?-$)/ and $1 !~ /1234/){$data=$1};if(defined $data and /^-(.*)/ and $1 !~ /1234/){print $data;print "$1\n"}' tmp
  2. [:a:]--------[id:uyux]--------[:/a:]
  3. [:a:]--------[id:werq]--------[:/a:]
  4. [:a:]--------[id:zxcv]--------[:/a:]
  5. [:a:]--------[id:sdfa]--------[:/a:]
  6. [:a:]--------[id:stre]--------[:/a:]
  7. [:a:]--------[id:sdfa]--------[:/a:]
  8. [:b:]-------[id:stre][nn:1300]--------[:/b:]
  9. [:a:]-------[id:eref]--------[:/a:]
  10. [:b:]--------[id:eref][nn:1301]--------[:/b:]
复制代码
用perl做的,其实效率在于regex的优化....用精确匹配前面的。
大文件应该效率没什么问题,其实还可以再次优化的。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP