免费注册 查看新帖 |

Chinaunix

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

搜索字符生成新文件问题 [复制链接]

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
21 [报告]
发表于 2009-01-06 09:43 |只看该作者

回复 #19 我是DBA 的帖子

在测测这个:

  1. awk 'BEGIN{for(i=100;i<=999;i++) a[i]=1}{for(i=1;i<=NF;i++)if($i in a)printf $i" ";print ""}' urfile
复制代码

论坛徽章:
0
22 [报告]
发表于 2009-01-06 09:46 |只看该作者
原帖由 我是DBA 于 2009-1-6 09:26 发表
我的测试文件只是200多M跟11G还是有很大差别的。

Oooooo.你的ll没-h,我看成了2G多,以为差不多了,呵呵眼睛不好使了

论坛徽章:
0
23 [报告]
发表于 2009-01-06 09:53 |只看该作者

回复 #21 ly5066113 的帖子


  1. [test@erpdataserver ~]$ time awk 'BEGIN{for(i=100;i<=999;i++) a[i]=1}{for(i=1;i<=NF;i++)if($i in a)printf $i" ";print ""}' urfile >urfile22

  2. real    0m54.337s
  3. user    0m53.837s
  4. sys     0m0.490s
复制代码

目前为止,这个最快。

[ 本帖最后由 我是DBA 于 2009-1-6 09:59 编辑 ]

论坛徽章:
0
24 [报告]
发表于 2009-01-06 09:57 |只看该作者
有没哪位高手有心情和时间,讲解一下这几个例子为什么有时间差?
为什么效率不一样?

论坛徽章:
0
25 [报告]
发表于 2009-01-06 09:58 |只看该作者
楼上的用“代码”嘛,不会变形,还能copy to clipboard

bbb.jpg (906 Bytes, 下载次数: 27)

bbb.jpg

论坛徽章:
0
26 [报告]
发表于 2009-01-06 09:59 |只看该作者

回复 #25 ywlscpl 的帖子

谢谢,学习了。

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
27 [报告]
发表于 2009-01-06 10:55 |只看该作者

回复 #12 我是DBA 的帖子

改成
  1. time awk '{for(i=1;i<=NF;i++)if($i~/^[0-9][0-9][0-9]$/)printf $i" ";printf "\n"}' urfile >newfile.txt
复制代码

能快很多

论坛徽章:
0
28 [报告]
发表于 2009-01-06 12:04 |只看该作者

回复 #26 我是DBA 的帖子

time awk '{for(i=1;i<=NF;i++)if($i~/^[0-9][0-9][0-9]$/)printf $i" ";printf "\n"}' urfile >newfile.txt


再测测这个

论坛徽章:
0
29 [报告]
发表于 2009-01-06 12:09 |只看该作者
写了个c代码.
test.c:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>

/*1 for null*/
#define bufsize    4097   

extern int errno;
static char buf[bufsize];
static char *mystrtok(char*);

/*返回第一个数字串*/
static char *mystrtok(char *str){
    register int pos    =0;
    char *ptr    = NULL;

    while(str[pos]!='\0'){
        if(str[pos]>='0'&&str[pos]<='9')    {
            if(ptr==NULL)    ptr    = &str[pos];
        }else{
            str[pos]    = '\0';
            if(ptr!=NULL)    break;
        }
        pos++;
    }
    return ptr;
}

int main(int argc,char *argv[]){
   
    int fd;
    register int len;

    if(argv[1]){
        fd    = open(argv[1],O_RDONLY);
        if(fd<=0) {
            fprintf(stderr,"can not open file:%s\n",argv[1]);
            return -1;
        }
    }else{
        fd    = fileno(stdin);
    }

    memset(buf,0,bufsize);
    while((len=read(fd,buf,bufsize-1))>0){
        
        
        /*防止截断了数字串*/
        if(len==(bufsize-1)){
            register    int i=0;
            while(buf[len-i-1]>='0'&&buf[len-i-1]<='9'){
                i++;
            }
            if(i>0&&i<len){
                buf[len-i]    = '\0';
                if(lseek(fd,-i,SEEK_CUR)==-1){
                    printf("seek error,errno is :%d\n",errno);
                    close(fd);
                    return -1;
                }
            }
        }

        char *ptr,*cursor=buf;
        while((ptr=mystrtok(cursor))!=NULL){
            
            /*这里可以插入链表,进行排序,少的话,用快速排序法,多的话,用堆排序或并归排序*/
            fprintf(stdout,"%s\n",ptr);
            cursor    = strlen(ptr)+ptr+1;
        }

        memset(buf,0,bufsize);
    }

    close(fd);

    return 0;
}



使用方法
[root@test1 c]# gcc  test.c -o test
[root@test1 c]# ./test <in.txt >out.txt

不知道速度如何.

论坛徽章:
0
30 [报告]
发表于 2009-01-06 12:25 |只看该作者
原帖由 ynchnluiti 于 2009-1-6 10:55 发表
改成
time awk '{for(i=1;i
  1. [test@erpdataserver ~]$ time awk '{for(i=1;i<=NF;i++)if($i~/^[0-9][0-9][0-9]$/)printf $i" ";printf "\n"}' urfile >newfile.txt

  2. real    1m59.423s
  3. user    1m58.951s
  4. sys     0m0.452s
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP