免费注册 查看新帖 |

Chinaunix

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

shell关于字符串操作的几种效率 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-16 19:18 |只看该作者 |倒序浏览
这两天就折腾一东西,如何替换一行里面的几个字符串。因为数据比较大,又涉及到效率的问题。假设只处理一个字符串ffsddfrgggh   ertijg335345348573489 598908908590-3-[][]459009  49568fsdfssd想替换掉红色部分的字段为5个空格。假设红色字符串的位置分别为【20,25】,【45,50】由于是文件就涉及到读文件的问题
1,最不理想做法while read LINE
do
str1=`echo "$LINE"|awk ' { print substr($LINE,1,19)}'`
str2=`echo "$LINE"|awk ' { print substr($LINE,26,18)}'`
str3=`echo "$LINE"|awk ' { print substr($LINE,51)}'`
str=`echo "$str1     $str2     $str3"`
echo "$str">>temp
done $filename
上面的例子我用去测试1.5G的文件时候,跑了一个小时才处理了100M。最后受不了了直接Ctrl+C掉了2,改进的做法
while read LINE
do
str=`echo "$LINE"|awk ' { printf"%s     %s     %s",substr($LINE,1,19),substr($LINE,26,18),substr($LINE,51)}'`
echo "$str">>temp
done $filename
上面的例子就是改正了echo中的处理字符串而已。效果也是不好3,学长就一直要求我看能不能用一个命令搞定。后面才发现主要瓶颈在于读文件上,上面的两个例子都是一行一行读,一个1.5G的文本文件具有上千万行的处理级别。3,LINUX下的最终版  测试1.5G只用了4分钟。
cat filename | awk '{printf"%s     %s     %s\n",substr($0,1,19),    substr($0,26,18),substr($0,51)}'>temp
总结:   其实这个虽然简单,但是涉及到awk 的substr()内置函数的用法,只有了解了为什么($0,26,18)后面最后一个数代表的是从26开始截取18个字符的意思才能作对。   还有AIX不支持内置变量如$LINE,所以因尽量转换为$1,$2的状态。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/65552/showart_1901826.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP