免费注册 查看新帖 |

Chinaunix

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

[文本处理] 统计数据:请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-14 10:18 |只看该作者 |倒序浏览
因为经常要处理类似于这样的文件,要统计这个文件中第二列与第三列都为0时,第一列对应的区间长度。
例如一个名为data的文件,cat data:
  0.96  0.171  0.000           
  0.97  0.111  0.000           
  0.98  0.127  0.000           
  0.99  0.271  0.000           
  1.00  0.000  0.000           
  1.01  0.000  0.000            
  1.34  0.000  0.000            
  1.35  0.000  0.000            
  1.36  0.000  0.000            
  1.37  0.000  0.000            
  1.38  0.000  0.312            
  1.39  0.268  0.154            
  1.40  0.550  0.228            
  1.41  0.781  0.000               
  1.42  0.130  0.000           
  1.96  0.000  0.000            
  1.97  0.000  0.000            
  2.00  0.000  0.000           
  2.01  0.000  0.000            
  2.02  0.053  0.000            
  2.03  0.188  0.110            
  2.04  0.849  0.760
第二列与第三列都为0时,对应的第一列区间为:  1.00~1.37,1.96~2.01
所以对应的第一列的区间长度为1.37-0.99+2.01-1.95=0.38+0.06=0.44
请问,如何用命令操作这个文件,得到这个结果呢?谢谢!

论坛徽章:
0
2 [报告]
发表于 2012-11-14 10:25 |只看该作者
给你提供思路:

如果第二三列都为0是,打印出 行数a 和此时第一列的数字b
然后a++,判断,如果a++ 行数的第二三列还未0,继续a++。 知道a++行数时,二三列中一个不为0时候,打印出行数 c ,和此时的第一列数字d ,
然后 d- b-0.01

论坛徽章:
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
3 [报告]
发表于 2012-11-14 11:12 |只看该作者
  1. [seesea2517@UC ~] #awk -f stat.awk data
  2. 0.44

  3. [seesea2517@UC ~] #cat stat.awk
  4. BEGIN {
  5.     reset()
  6.     result = 0
  7. }

  8. {
  9.     if ($2==0 && $3==0)
  10.     {
  11.         min = ($1 < min ? $1 : min)
  12.         max = ($1 > max ? $1 : max)

  13.         next
  14.     }

  15.     if (max < 0)
  16.     {
  17.         next
  18.     }

  19.     result += max - min + 0.01
  20.     reset()
  21. }

  22. END {
  23.     print result
  24. }

  25. function reset()
  26. {
  27.     min = 9999
  28.     max = -1
  29. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2012-11-14 15:18 |只看该作者
seesea2517 发表于 2012-11-14 11:12


首先,谢谢,这个脚本没有问题,就是稍显长了点,不知能否更精简点?

论坛徽章:
0
5 [报告]
发表于 2012-11-14 15:31 |只看该作者
awk 'BEGIN{c=0} {if($2==0 && $3==0){c=$1;b=[ ]; result=c-b+0.01 }} END{print result}' data

其中的b=[ ] 我想表达为第一个$2==0 && $3==0时的$1,怎么表达?

论坛徽章:
0
6 [报告]
发表于 2012-11-14 15:39 |只看该作者
qinggzha 发表于 2012-11-14 10:25
给你提供思路:

如果第二三列都为0是,打印出 行数a 和此时第一列的数字b

思路比较清晰,不过我想知道,一定要打印行数吗?有什么作用呢

论坛徽章:
0
7 [报告]
发表于 2012-11-14 16:14 |只看该作者
没必要行数,我只是用来做递增的时候根据行数来统计,所以打印了 回复 6# huazhorg


   

论坛徽章:
0
8 [报告]
发表于 2012-11-14 16:22 |只看该作者
qinggzha 发表于 2012-11-14 16:14
没必要行数,我只是用来做递增的时候根据行数来统计,所以打印了 回复 6# huazhorg

能否把你写的贴出来看看?

论坛徽章:
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
9 [报告]
发表于 2012-11-14 16:34 |只看该作者
huazhorg 发表于 2012-11-14 15:18
首先,谢谢,这个脚本没有问题,就是稍显长了点,不知能否更精简点?

本人无能,不能精简。

论坛徽章:
0
10 [报告]
发表于 2012-11-14 16:37 |只看该作者
seesea2517 发表于 2012-11-14 16:34
本人无能,不能精简。

感谢!那就这样了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP