免费注册 查看新帖 |

Chinaunix

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

处理这个问题 我的思路写出来了 大家谁还有别的思路 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 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.         }'
复制代码

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
2 [报告]
发表于 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
复制代码

论坛徽章:
1
辰龙
日期:2014-05-22 11:38:58
3 [报告]
发表于 2012-03-04 08:38 |只看该作者
昨天回复的帖子怎么都没啦

论坛徽章:
0
4 [报告]
发表于 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

论坛徽章:
0
5 [报告]
发表于 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]];
                }
        }
}
~

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
6 [报告]
发表于 2012-03-05 18:17 |只看该作者
不知为何这个被收到回收站了, 我恢复了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP