免费注册 查看新帖 |

Chinaunix

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

[文本处理] 数据区间处理请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-10 08:43 |只看该作者 |正序浏览
本帖最后由 bmechuangye 于 2013-09-10 09:59 编辑

各位,我要将数据 dat.zip (379 Bytes, 下载次数: 16)



A        0        0.00521
A        1        0.0111
A        2        0.0173
A        3        0.0281
A        4        0.0423
A        5        0.0606
A        6        0.0938
A        7        0.128
A        8        0.159
A        9        0.174
A        10        0.183
A        11        0.19
A        12        0.2
A        13        0.216
A        14        0.236
A        15        0.257
A        16        0.276
A        17        0.292
A        18        0.309
A        19        0.327
A        20        0.342
A        21        0.36
A        22        0.375
A        23        0.392
A        24        0.413
A        25        0.434
A        26        0.454
A        27        0.474
A        28        0.489
A        29        0.505
A        30        0.521
A        31        0.232
A        32        0.205
A        33        0.177
A        34        0.157
A        35        0.14
A        36        0.133
A        37        0.128
A        38        0.126
A        39        0.122
A        40        0.117
A        41        0.109
A        42        0.0973
A        43        0.0841
A        44        0.0706
A        45        0.0629
A        46        0.0549
A        47        0.0459
A        48        0.0369
A        49        0.0285
A        50        0.0211
A        51        0.0135
A        52        0.00663
A        53        0.839
A        54        0.848
A        55        0.857
A        56        0.864
A        57        0.872
A        58        0.878
A        59        0.885
A        60        0.885

按第三列值的大小分成区间,比如第三列小于0.3为small,大于0.3的为big,将第二列值处理成区间模式,比如第二列0-17均小于0.3,类似地,整个就可以简化为:

A        0        17        small
A        18        30        big
A        31        52        small
A        53        60        big
捣鼓了很久,不知如何下手,请教高手指点一下,谢谢!

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
17 [报告]
发表于 2013-09-16 15:35 |只看该作者
http://bbs.chinaunix.net/thread-3620300-2-1.html

跟这个完全差不多。看来awk很多问题都是类似的。

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
16 [报告]
发表于 2013-09-16 15:32 |只看该作者
  1. awk 'function is_big(x){

  2.     if(x>0.3) return "big"; else return "small" }


  3.     NR==1{tag=is_big($3);start=end=$2;x=$1

  4.       }NR>1{

  5.         if(is_big($3)==tag && x==$1 &&$2==end+1){
  6.                
  7.                            end=$2

  8.                         }else{

  9.                                print x,start,end,tag; end=start=$2;tag=is_big($3);x=$1
  10.                                         }

  11.                 }END{print x,start,end,tag }'
复制代码
这个应该符合了。看了下跟jason的那个思路差不多啊。

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
15 [报告]
发表于 2013-09-16 11:58 |只看该作者
晕,假如这样的话,NR>1的时候首先判断$1,还得同样写一个else部分来处理。

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
14 [报告]
发表于 2013-09-16 11:49 |只看该作者
哦,没看到7楼,假如有A,B的话,那首先得针对$1排序,同时$2要升序排序。

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
13 [报告]
发表于 2013-09-16 11:17 |只看该作者
回复 1# bmechuangye
  1. awk 'function is_big(x){

  2.     if(x>0.3) return "big"; else return "small" }


  3.     NR==1{tag=is_big($3);start=end=$2

  4.       }NR>1{

  5.         if(is_big($3)==tag){
  6.                 if($2==end+1){end=$2

  7.                                         }else{
  8.                        
  9.                        
  10.                                                 print "A\t"start,end,tag;end=start=$2;tag=is_big($3)
  11.                                                
  12.                                                 }                  


  13.                         }else{

  14.                                 print "A\t"start,end,tag;end=start=$2;tag=is_big($3)
  15.                                         }

  16.                 }END{print "A\t"start,end,tag }'
复制代码
和这个是一类问题。http://bbs.chinaunix.net/thread-3620300-1-1.html

论坛徽章:
0
12 [报告]
发表于 2013-09-11 21:38 |只看该作者
回复 11# jason680


  牛!谢谢jason680指教!

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
11 [报告]
发表于 2013-09-10 18:35 |只看该作者
本帖最后由 jason680 于 2013-09-10 18:39 编辑

回复 10# bmechuangye

...
A        17        0.292
A        18        0.309  <== case1
...
A        30        0.521
A        31        0.232  <== case 1
...
A       60      0.885
B       0       0.000449  <== case 2


case 1, big/small is changed
         
A        17        0.292   <== last time {N=$1;e=$2;r=x}
A        18        0.309   <== current

Now(current)...
N="A" ,  e=17,  r="small"
$1="A",  $2=18, x="big"

check condition:  $1!=N||$2-e!=1||x!=r{if(N)print N,s,e,r;s=$2}
x!=r will be true ("big" is not the same "small")
and output the information, and reset the start(s) from $2(18)
A 0 17 small <== output information

Case 2: N is changed


A       60      0.885
B       0       0.000449  <== current

Now(current)...
N="A" ,  e=60,  r="big"
$1="B",  $2=0,  x="small"

check condition:  $1!=N||$2-e!=1||x!=r{if(N)print N,s,e,r;s=$2}
$1!=N will be true ("A" is not the same "B")
and output the information, and reset the start(s) from $2(0)
A 53 60 big  <== output information

Case3: the $2 is not consecutive number with last time
Note: There is no this case in your data
for example:
A        17        0.292   
A        20        0.209   <== it is not consecutive number from 17 to 20

check condition:  $1!=N||$2-e!=1||x!=r{if(N)print N,s,e,r;s=$2}
$2-e!=1 will be true (it is not consecutive number from 17 to 20)

         
   

论坛徽章:
0
10 [报告]
发表于 2013-09-10 18:04 |只看该作者
本帖最后由 bmechuangye 于 2013-09-10 18:05 编辑

jason680,能否请您解释一下“$1!=N||$2-e!=1||x!=r{if(N)print N,s,e,r;s=$2}{N=$1;e=$2;r=x}”这部分的具体意思?我也经常用awk,但发现还是菜鸟一个,哈哈,这个怎么发现很难理解啊。
谢谢!

论坛徽章:
0
9 [报告]
发表于 2013-09-10 17:06 |只看该作者
回复 8# jason680


强!感谢jason680的热心解答,试了试,很好!
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP