免费注册 查看新帖 |

Chinaunix

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

[数值计算] 在shell script中如何进行除法计算? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-01-21 15:21 |只看该作者 |倒序浏览
在文件Rtrm.stat 中有一行如图1, 内容是throughput的值。
我在shell script 中要攫取出这个值,并赋给变量throughput,
并进行除法计算,除以1000000,结果保留两位小数

一下是我写的 语句 , 可是行不通, 请帮我修改下吧 谢谢!

declare -i throughput=`grep "Throughput" Rtrm.stat | sed "s/^.*Throughput/Throughput/g" |sed "s/(.*= //g"`
throughput=$(($throughput/100000))

论坛徽章:
0
2 [报告]
发表于 2014-01-21 15:30 |只看该作者
本帖最后由 runintostar 于 2014-01-21 15:42 编辑

回复 1# shiwenze

看不懂了,要赋值干嘛还要把"Throughput"保留下来。那不就赋值报错了
declare -i throughput=`grep "Throughput" Rtrm.stat | sed "s/^.*= //g"`

Sorry,刚才没看到你要保留小数的需求,这样弄下,不过没有四舍五入

grep "Throughput" Rtrm.stat | sed 's/^.*= //g;s/....$//;s/..$/\.&/;s/^\./0&/'

论坛徽章:
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
3 [报告]
发表于 2014-01-21 15:50 |只看该作者
回复 1# shiwenze

$ cat Rtrm.stat
xxx
1,   ,[1024], Application, RTRM Client,Throughput (bits/s) = 1203801
yyy

$ throughput=`awk '/Throughput/{printf"%.2f",$NF/10**6}' Rtrm.stat`

$ echo $throughput
1.20

   

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
4 [报告]
发表于 2014-01-21 16:06 |只看该作者
  1. echo "scale=3; 0.3/100" | bc -l
复制代码

论坛徽章:
0
5 [报告]
发表于 2014-01-21 16:08 |只看该作者
回复 2# runintostar

谢谢你,  可是后面的一长串我就看不懂了, 能不能讲解一下



   

论坛徽章:
0
6 [报告]
发表于 2014-01-21 16:29 |只看该作者
shiwenze 发表于 2014-01-21 16:08
回复 2# runintostar

谢谢你,  可是后面的一长串我就看不懂了, 能不能讲解一下


你要除1000000,保留两位小数,所以就先把最后四个字符删掉,然后在倒数第二个字符前面加一个小数点,最后是如果小数点前没有字符了,就加一个0
s/....$//;s/..$/\.&/;s/^\./0&/

论坛徽章:
0
7 [报告]
发表于 2014-01-21 16:36 |只看该作者
回复 4# q1208c

你好 后来我用的的方法达到了目标, 只是我只能用你提供的语句 输出Throughput的值。  如果要在前面加上 Throughput
我的方法是  echo "Throughput `echo "scale=2;$throughput/1000000" | bc -l` "
我觉得我的方法太烦了

请问有没有更简单的方法?
   

论坛徽章:
0
8 [报告]
发表于 2014-01-21 16:39 |只看该作者
回复 6# runintostar

厉害厉害 这都能想到!!
原来sed 的模式 还能这么用的啊。  每一次 ;是不是对前面的字符串再处理一次?

   

论坛徽章:
0
9 [报告]
发表于 2014-01-21 16:56 |只看该作者
shiwenze 发表于 2014-01-21 16:39
回复 6# runintostar

厉害厉害 这都能想到!!


差不多,sed每次默认读进来1行到pattern space里,每一个command都是对这个space里的内容操作,";"后面的command的处理对象是前面的处理完成的结果。
可以找一些原理介绍看,我也是最近才知道,以前只会最简单的瞎用

论坛徽章:
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
10 [报告]
发表于 2014-01-21 17:10 |只看该作者
回复 2# runintostar

some bug

$ cat Rtrm.stat
xxx
1,   ,[1024], Application, RTRM Client,Throughput (bits/s) = 1203801
1,   ,[1024], Application, RTRM Client,Throughput (bits/s) = 120
yyy


$ grep "Throughput" Rtrm.stat | sed 's/^.*= //g;s/....$//;s/..$/\.&/;s/^\./0&/'
1.20
1.20



   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP