免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7109 | 回复: 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
捣鼓了很久,不知如何下手,请教高手指点一下,谢谢!

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
2 [报告]
发表于 2013-09-10 09:00 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
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
3 [报告]
发表于 2013-09-10 09:33 |只看该作者
应该是个很简单的问题,但看描述完全看不懂。

论坛徽章:
0
4 [报告]
发表于 2013-09-10 09:56 |只看该作者
谢谢二位,抱歉,我重新编辑了一下问题。求指教,谢谢!

论坛徽章:
0
5 [报告]
发表于 2013-09-10 10:07 |只看该作者
  1. BEGIN{
  2.     INT=0.3
  3. }
  4. {
  5. if($3>=INT){
  6.     A[$2]="big"
  7. }
  8. else{
  9.     A[$2]="small"
  10. }
  11. }
  12. END{
  13.     MIN=0
  14.     for(i=1;i<=NR;i++){
  15.         if(A[i]==A[i-1]){
  16.             MAX=i
  17.         }
  18.         if(A[i]!=A[i-1]){
  19.             print "A ",MIN,MAX,A[i-1]
  20.             MIN=i
  21.             MAX=i
  22.         }
  23.     }
  24.    
  25. }
复制代码
直接取第一列了.

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
6 [报告]
发表于 2013-09-10 10:48 |只看该作者
撞 awk 的枪口上了。

论坛徽章:
0
7 [报告]
发表于 2013-09-10 11:36 |只看该作者
回复 5# chaseey

强大,处理前面附件里的数据没有任何问题,谢谢!
但上面数据加上
B       0       0.000449
B       1       0.00102
B       2       0.00208
B       3       0.00352
B       4       0.00569
B       5       0.00977
B       6       0.0161
B       7       0.0208
B       8       0.0255
B       9       0.0303
B       10      0.0347
B       11      0.0392
B       12      0.0433
B       13      0.0473
B       14      0.0511
B       15      0.0538
B       16      0.0561
dat01.zip (471 Bytes, 下载次数: 11)




并且打印语句改为print $1,MIN,MAX,A[i-1],运行结果
$ awk -f test.awk dat01.txt
B 0 17 small
B 18 30 big
B 31 52 small
B 53 60 big

出现问题了,结果第一列全变成B的了。

论坛徽章:
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
8 [报告]
发表于 2013-09-10 14:11 |只看该作者
本帖最后由 jason680 于 2013-09-10 14:13 编辑

回复 7# bmechuangye

How about this ...

# cat data01.txt | awk -vP=0.3 '{x=($3-P>0)?"big":"small"}$1!=N||$2-e!=1||x!=r{if(N)print N,s,e,r;s=$2}{N=$1;e=$2;r=x}END{print N,s,e,r}'
A 0 17 small
A 18 30 big
A 31 52 small
A 53 60 big
B 0 16 small

   

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


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

论坛徽章:
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,但发现还是菜鸟一个,哈哈,这个怎么发现很难理解啊。
谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP