免费注册 查看新帖 |

Chinaunix

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

求个shell,都来看看 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-28 11:46 |只看该作者 |倒序浏览
文件如下
0    222
1    224
0    226
0    228
0    227
1    300
1    301
1    304
1    311
0    322
0    333
1    335
0    337

0代表正常1代表异常,如果出现1的话则用(从出现1开始的直至出现0的一段状态的$2相减)最后把总和相加,
如上应该是
(226-224)+(322-300)+(337-335)=26

shell应该怎么写呢?

论坛徽章:
0
2 [报告]
发表于 2010-04-28 11:59 |只看该作者
up~

论坛徽章:
0
3 [报告]
发表于 2010-04-28 12:00 |只看该作者
吃饭了~下午在看看吧

论坛徽章:
0
4 [报告]
发表于 2010-04-28 12:00 |只看该作者
  1. awk 'BEGIN{a=0}{if($1==1){a=a - $2;do {getline;}while($1 == 1) a=$2 + a;}} END{print a}'  file
复制代码

论坛徽章:
0
5 [报告]
发表于 2010-04-28 12:33 |只看该作者
回复 1# 网络守夜人
  1. awk '$1==1&&!t{t=$2}$1==0&&t{a+=$2-t;t=0}END{print a}' file
复制代码

论坛徽章:
2
IT运维版块每日发帖之星
日期:2016-02-10 06:20:01IT运维版块每日发帖之星
日期:2016-02-11 06:20:00
6 [报告]
发表于 2010-04-28 12:38 |只看该作者
试试
  1. awk '$1==0&&n==1{a=$2-v;n=0;t+=a;next}$1==1&&n==0{n=1;v=$2}END{print t}' /tmp/a
复制代码

论坛徽章:
0
7 [报告]
发表于 2010-04-28 13:59 |只看该作者

  1. gawk 'BEGIN{t=0;a[0]=1;a[1]=-1}xor(t,$1){c+=a[$1]*$2}{t=$1}END{print c}' 数据文件

  2. 思路:
  3. 当$1从0变为1的时候,需要使用它的$2,同时,当$1从1变为0的时候,也需要它的$2
  4. $1为1的行,$2需要变为负值,然后这些$2相加

  5. 初始的时候,把t设定为0,然后与下一行的$1进行异或运算,运算值为真的话,就需要处理
  6. a[0]=1;a[1]=-1 是为了简化计算,省得进行条件判断
复制代码

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
8 [报告]
发表于 2010-04-28 14:34 |只看该作者
回复 7# springwind426


    思路很好!
    可以简写为
  1. awk 'xor(t,$1){c+=(-1)^$1*$2}{t=$1}END{print c}' urfile
复制代码

论坛徽章:
0
9 [报告]
发表于 2010-04-28 14:55 |只看该作者
回复 1# 网络守夜人
  1. #! /usr/bin/awk -f
  2. BEGIN{flag=0;result=0}
  3. {        if($1==0) {
  4.           if(flag==1) {
  5.                 result=result+$2;
  6.                 flag=0;
  7.         }
  8.         } else {
  9.         if (flag==0) {
  10.                 result=result-$2;
  11.                 flag=1;
  12.         }
  13.         }
  14. }
  15. END{print result}               
复制代码
awk条件判断是用==的,弄了半天!

论坛徽章:
0
10 [报告]
发表于 2010-04-28 15:00 |只看该作者
回复  springwind426


    思路很好!
    可以简写为
blackold 发表于 2010-04-28 14:34



太强了,我想了半天,就没有想到好的办法把 1 ,0 与 -1 1 对应上,我真是笨
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP