免费注册 查看新帖 |

Chinaunix

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

[文本处理] sed 和awk处理文件占CPU太高,求优化方案 [复制链接]

论坛徽章:
1
15-16赛季CBA联赛之八一
日期:2017-02-21 17:19:04
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-09-11 21:33 |只看该作者 |倒序浏览
本帖最后由 psmzs 于 2015-09-11 22:24 编辑

我遇到这么一个情况,100多个文件大小不一,最大的有几百M,里面记录分隔使用的逗号,但是字段里的数据可能含有回车和换行,每条记录分隔是以|$|作为标记。由于为了用sort能对每个文件进行排序(貌似sort是以换行符作为记录的分隔,但是由于字段也含有回车和换行,因此排序会受影响。)因此想了一个方案删除了每个文件的回车\r和换行\n,然后在|$|之后再加个换行\n,因此写了如下代码

files.txt 包含了所有文件的名字
while  read  fileName

do

   tr -d '\r\n' < $fileName | sed 's/|\$|/&\n/' | sort > ${fileName}_bak(此法程序运行卡卡住了,CPU被sed占到了100%,等了很长时间没运行完)

#后来尝试了改为awk 以为awk能快点,貌似还是很慢 ,CPU也到了100%,现象同上  cat  $fileName | awk 'BEGIN{FS=",";RS="\\|\\$\\|"}{gsub(/[\r\n]+/,"");print}'| sort > ${fileName}_bak
#后来考虑是不是管道的影响,把命令拆开,还是不行,求高手优化,帮忙分析CPU占过高的原因!!

done  < files.txt

自己以前还碰到一个情况就是N多文件,想删除每个文件里的空格,写了一个循环,遍历每个文件,在循环里用sed删空格,但是程序也卡住了,很长时间没运行完,后来改为awk删除空格才没卡住,求大,家分析原因给出好的法子。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2015-09-11 21:53 |只看该作者
回复 1# psmzs


    你的机器内存多大?

论坛徽章:
1
15-16赛季CBA联赛之八一
日期:2017-02-21 17:19:04
3 [报告]
发表于 2015-09-11 21:55 |只看该作者
本帖最后由 psmzs 于 2015-09-11 21:56 编辑

这个和内存有关系吗?我没注意,是公司里的一个服务器。。代码方面有优化的余地吗?最后都是感觉程序卡住了,CPU到了100%

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2015-09-11 21:59 |只看该作者
本帖最后由 MMMIX 于 2015-09-11 22:01 编辑
psmzs 发表于 2015-09-11 21:55
这个和内存有关系吗?

当然了。

我没注意,是公司里的一个服务器。。


那应该不会太小。

代码方面有优化的余地吗?


很大。例如,你需要先删除一遍 \r, \n 然后再添加 \n 么?你知道对一个几百M的字符串进行正则匹配然后替换有多慢么?(sed 卡住了……)排序的时候需要用整行作为 key 么?

论坛徽章:
1
15-16赛季CBA联赛之八一
日期:2017-02-21 17:19:04
5 [报告]
发表于 2015-09-11 22:11 |只看该作者
排序是整行排就可以,不用分字段,但是不调整的话会把字段里的换行也sort了,所以想删除文件里所有的\r\n猴在记录末尾在加上\n,哪里能优化一下?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
6 [报告]
发表于 2015-09-11 22:18 |只看该作者
psmzs 发表于 2015-09-11 22:11
排序是整行排就可以,


整行排序它慢呀

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
7 [报告]
发表于 2015-09-11 22:22 |只看该作者
psmzs 发表于 2015-09-11 22:11

哪里能优化一下?


把那个 tr 和 sed 都去了,只用 awk,逐个记录读取,进行调整(删除中间的换行啥的);然后排序的时候最好是能把需要的 key 取出来,用整行做 key 会比较慢。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
8 [报告]
发表于 2015-09-11 22:23 |只看该作者
psmzs 发表于 2015-09-11 22:11
想删除文件里所有的\r\n猴在记录末尾在加上\n


这就是你代码慢的原因。

论坛徽章:
1
15-16赛季CBA联赛之八一
日期:2017-02-21 17:19:04
9 [报告]
发表于 2015-09-11 22:52 |只看该作者
回复 8# MMMIX


   哪对于多个文件的用了正则的话,有优化的地方吗,比如我的第二个情况就一个删多个文件里的空格,sed也卡住了。

论坛徽章:
1
15-16赛季CBA联赛之八一
日期:2017-02-21 17:19:04
10 [报告]
发表于 2015-09-11 23:07 |只看该作者
回复 8# MMMIX

哪对于大文件的多个正则操作,怎么办?一般注意什么?增加机器配置的是一个方面,代码方面有什么建议吗?

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP