Chinaunix

标题: 处理这个问题 我的思路写出来了 大家谁还有别的思路 [打印本页]

作者: dahaoshanhe    时间: 2012-03-03 14:11
标题: 处理这个问题 我的思路写出来了 大家谁还有别的思路
我自己写了一个,哪位高手有更好的解决办法

源文件:
  1. 63   63
  2. 74   74
  3. 82   82
  4. 95   95
  5. 96   96
  6. 99   99
  7. 97   97
  8. 98   98
  9. 100 100
  10. 114 114
  11. 123 123
  12. 135 135
复制代码
目的:在源文件中,每行有两列,两列数值相同,行与行之间有的增量为1,有的增量不为1,如第4行与第

5行增量为1,增量为1的行也可能不是紧邻连续着的,如第5行与第7行增量为1,但是不相邻连续的。想把一个几百万行的

文件中增量为1的行进行压缩,比如95到100之间增量都为1,压缩成95 100 第一列放连续递增中起始值,第二列放连续增

量结束值。
  1. 63   63
  2. 74   74
  3. 82   82
  4. 95  100
  5. 114 114
  6. 123 123
  7. 135 135
复制代码
{:3_205:}

我的 :
  1. awk 'BEGIN {
  2.                 SROW=2
  3.                 EROW=1540
  4.                 STARTR=0
  5.                 ENDR=0
  6.                 DELTA=0
  7.         }
  8.         {
  9.                 if(NR==SROW){
  10.                         STARTR=$3
  11.                         ENDR=$4
  12.                 }
  13.                 if(NR>SROW){
  14.                         DELTA=$3-ENDR
  15.                         if((DELTA==1)||(DELTA==0)) ENDR=$3
  16.                         if(DELTA>1){
  17.                                 temp=$3
  18.                                 $3=STARTR
  19.                                 $4=ENDR
  20.                                 printf "%s\n",$0
  21.                                 STARTR=temp
  22.                                 ENDR=STARTR
  23.                         }
  24.                 }
  25.                 if(NR==EROW){
  26.                         $3=STARTR
  27.                         printf "%s\n",$0
  28.                 }
  29.         }'
复制代码

作者: rdcwayx    时间: 2012-03-04 07:33
本帖最后由 rdcwayx 于 2012-03-04 08:12 编辑
  1. awk 'BEGIN{min=999999999;t=0}
  2.      {a[$1];min=min<$1?min:$1;max=max>$1?max:$1}
  3.      END { printf min FS;s=min;
  4.            for (i=min+1;i<=max;i++)
  5.               { if (i in a)
  6.                   {  if (t) {printf i FS;t=0 }
  7.                      s=i
  8.                   }                        
  9.                 else {if (!t) {printf s RS;t=1}}
  10.                }
  11.             printf s RS
  12.           }' infile
复制代码

作者: winway1988    时间: 2012-03-04 08:38
昨天回复的帖子怎么都没啦
作者: jiejie455    时间: 2012-03-04 09:13
本帖最后由 jiejie455 于 2012-03-04 09:13 编辑

  1. #!/usr/bin/awk -f

  2. {
  3.         a[$1]=$1;
  4.         b[$1]=$0
  5. }

  6. END{
  7.         for(i=1;i<=asort(a);i++){
  8.                 pre=a[i]-1;
  9.                 post=a[i]+1;

  10.                 if(b[pre] || b[post]){
  11.                         if(line!=""){
  12.                                 line=line" "a[i] ;
  13.                         }else{
  14.                                 line=a[i];
  15.                         }
  16.                 }else{
  17.                         if(line!=""){
  18.                                 gsub(/[ ]+.*[ ]+/,"  ",line);
  19.                                 print line;
  20.                         }
  21.                         line="";
  22.                         print b[a[i]];
  23.                 }
  24.         }
  25. }
  26. ~
复制代码
$ ./data.awk data
63   63
74   74
82   82
95  100
114 114
123 123
135 135


作者: jiejie455    时间: 2012-03-04 09:26
怎么贴出来,看不见了。论坛是不是有问题啊。再贴一遍。

#!/usr/bin/awk -f

{
        a[$1]=$1;
        b[$1]=$0
}

END{
        for(i=1;i<=asort(a);i++){
                pre=a[i]-1;
                post=a[i]+1;

                if(b[pre] || b[post]){
                        if(line!=""){
                                line=line" "a[i] ;
                        }else{
                                line=a[i];
                        }
                }else{
                        if(line!=""){
                                gsub(/[ ]+.*[ ]+/,"  ",line);
                                print line;
                        }
                        line=""
                        print b[a[i]];
                }
        }
}
~

作者: rdcwayx    时间: 2012-03-05 18:17
不知为何这个被收到回收站了, 我恢复了。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2