Shell脚本处理浮点数的运算和比较实例

通过top命令看到的进程的CPU、内存的使用率的百分比是一个浮点数,我需要在写脚本时对其进行处理,所以学习了一些,总结如下。

其实,Shell(这里是Bash)本身不具备处理浮点计算的能力,但是可以使用“bc”这个高精度的计算器工具来帮助,另外,也可以在Bash中调用“awk”脚本来处理浮点运算。

1. 用bc来处理计算(包括整型和浮点计算)

bc – An arbitrary precision calculator language
(1). 通常在Bash脚本中使用bc的范例格式为:
variable=$(echo “OPTIONS; OPERATIONS” | bc [options]) 即:echo “[选项];操作” | bc [选项]
(2). 在下面的脚本中,提到在第一个选项中,“scale”变量表示输出中小数点后的精度,可以用于控制计算结果的精度;“ibase”和“obase”分别表示输入和输出数据的进制,可以用于数值进制的转换。
(3). 浮点数的比较,如“if [ $(echo "$big > $small" | bc) -eq 1 ]”,将一个逻辑判断式用管道传给bc。如果结果为真则输出1,否则输出0,然后就可以利用这个结果进行进一步的操作了。
(4). bc本来是用一个文件作为输入进行计算的(后面也有演示),所以可以将很复杂的计算写到文件中,然后让bc工具去处理到处计算结果。
注意一下:在使用除法运算符/时,要想保留小数,需要自己设置scale,否则默认时scale,小数点后时0位。

2. 使用awk来处理浮点计算和浮点数比较

不解释过多了,写了示例脚本如下,看懂了这个就会知道怎么处理浮点计算和浮点数比较了。


代码如下:

#!/bin/bash
# author: Jay <smile665@gmail.com>
# some examples for playing with floating point number.

# basic usage of 'bc' tool in Bash.
a=3.33
b=3.3
c=$(echo "$a + $b" | bc)
d=$(echo "$a * $b" | bc)
e=$(echo "scale=5; $a / $b" | bc)
echo "c=a+b=$a+$b=$c"
echo "d=a*b=$a*$b=$d"
echo "e=a/b=$a/$b=$e"

# "-l" parameter for 'bc' means using math library.
pi=$(echo "scale=10; 4*a(1)" | bc -l)
s=$(echo "s($pi/6)" | bc -l)
echo "pi=$pi"
echo "s=sin(pi/6)=$s"

# use more options of 'bc' tool
r=$(echo 'ibase=10;obase=2; 15+16' | bc)
echo "binary of (15+16) is $r"

# comparison for floating point numbers using 'bc'
big=100
small=99.9
if [ $(echo "$big > $small" | bc) -eq 1 ]; then
        echo "$big is bigger than $small"
fi

# deal with floating point numbers with 'awk' language
echo $(awk -v x=10 -v y=2.5 'BEGIN {printf "10/2.5=%.2f\n",x/y}')
v=$(echo $big $small | awk '{ printf "%0.8f\n" ,$1/$2}')
echo "$big / $small = $v"

echo $big $small | awk '{if($1>$2) {printf"%f > %f\n",$1,$2} else {printf"%f <%f\n",$1,$2}}'

执行的结果如下:


代码如下:

master@jay-linux:~/workspace/mygit/shell/sh2012$ ./floating-point.sh
c=a+b=3.33+3.3=6.63
d=a*b=3.33*3.3=10.98
e=a/b=3.33/3.3=1.00909
pi=3.1415926532
s=sin(pi/6)=.49999999994373819220
binary of (15+16) is 11111
100 is bigger than 99.9
10/2.5=4.00
100 / 99.9 = 1.00100100
100.000000 > 99.900000

另外,bc处理一个文件中的计算逻辑,演示如下:

代码如下:

master@jay-linux:~/workspace/mygit/shell/sh2012$ cat temp.bc
3+8
3/8
scale=2; 3/8

master@jay-linux:~/workspace/mygit/shell/sh2012$ bc -q temp.bc
11
0
.37

bc是强大的工具,请“man bc”查看详情;同样,请“man awk”。

(0)

相关推荐

  • PHP数据类型之整数类型、浮点数的介绍

    语法:整型值可以使用十进制,十六进制或八进制表示,前面可以加上可选的符号(- 或者 +). 八进制表示数字前必须加上 0(零),十六进制表示数字前必须加上 0x. $int1=100; //十进制$int2=-123; //负数$int3=0123; //八进制数$int4=0x1A;//十六进制数 echo PHP_INT_SIZE; //显示一个整数用几个字节来表示echo "<br/>";echo PHP_INT_MAX;echo "<br/>&

  • 正负小数点后两位浮点数实现原理及代码

    背景:项目中需要做个对两位小数点的正负浮点数的处理, 要求:非数字或者.字符自动清除,并对.12自动修补.前的0 原理:在输入框中加入两个事件,keyup与blur,keyup处理字符串中非要求的字符,blur中对最终字符串处理成理想的格式111.11 实现:通过七个正则处理掉主功能 val代表输入的字符串 /^\d*\.?\d{0,2}$/ 验证val是否是ddd.dd的格式,是则不处理,否才处理 /[^.0-9]+/ 处理掉val中所有的非数字与.的字符 /(?:\d*\.\d{0,2}|\

  • js浮点数保留两位小数点示例代码(四舍五入)

    复制代码 代码如下: var changeTwoDecimal_f= function (floatvar){      var f_x = parseFloat(floatvar);      if (isNaN(f_x)){          return '0.00';      }      var f_x = Math.round(f_x*100)/100;      var s_x = f_x.toString();      var pos_decimal = s_x.indexO

  • 基于C++浮点数(float、double)类型数据比较与转换的详解

    浮点数在内存中的存储机制和整型数不同,其有舍入误差,在计算机中用近似表示任意某个实数.具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法.所以浮点数在运算过程中通常伴随着因为无法精确表示而进行的近似或舍入.但是这种设计的好处是可以在固定的长度上存储更大范围的数.1.将字符串转换为float.double过程存在精度损失,只是float.double各自损失的精度不相同而已std::string str="8.2&

  • python读取浮点数和读取文本文件示例

    从文本文件中读入浮点数据,是最常见的任务之一,python没有scanf这样的输入函数,但我们可以利用正规表达式从读入的字符串中提取出浮点数 复制代码 代码如下: import refp = open('c:/1.txt', 'r')s = fp.readline()print(s)aList = re.findall('([-+]?\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?',s) #使用正规表达式搜索字符串print(aList)for ss in aList:   

  • Shell脚本处理浮点数的运算和比较实例

    通过top命令看到的进程的CPU.内存的使用率的百分比是一个浮点数,我需要在写脚本时对其进行处理,所以学习了一些,总结如下. 其实,Shell(这里是Bash)本身不具备处理浮点计算的能力,但是可以使用"bc"这个高精度的计算器工具来帮助,另外,也可以在Bash中调用"awk"脚本来处理浮点运算. 1. 用bc来处理计算(包括整型和浮点计算) bc – An arbitrary precision calculator language(1). 通常在Bash脚本中

  • shell脚本 自动创建用户详解及实例代码

    shell脚本 自动创建用户详解 需求:判断用户zhangsan是否存在,不存在就创建并设置密码为123456 1.vi createuser.sh 2.写入: USER_COUNT=`cat /etc/passwd | grep '^zhangsan:' -c` USER_NAME='zhangsan' if [ $USER_COUNT -ne 1 ] then useradd $USER_NAME echo "123456" | passwd $USER_NAME --stdin

  • Shell脚本中if条件判断的写法实例

    目录 前言 条件判断格式 if 语句 条件判断类型 按照文件权限进行判断 文件之间比较 整数之间比较 字符串的判断 多重条件判断 附:Shell if 判断语句参数 总结 前言 if…else… 可以说是我们在编程中最常见的条件判断语句了,那么在 Shell 中如何使用呢?如何判断两个数值相等?如何判断一个文件是否存在?跟随这篇文章,一起来学习吧! 条件判断格式 在 Shell 中有两种判断格式,分别如下: # 1. 第一种 test  条件判断式 # 2. 第二种,注意括号两端必须有空格 [

  • shell脚本语言之if条件判断语句实例详解

    目录 1.单分支if条件语句 1.1举例:判断目录是否存在,不存在则创建 2.双分支if条件语句 2.1举例:监听并自动重启apache服务脚本 3.多分支if条件语句 3.1举例:判断用户输入的是文件还是目录 4.case条件语句 4.1举例:创建启动脚本,让service命令管理apache 4.2举例:创建启动脚本,让service命令管理nginx 总结 1.单分支if条件语句 then后面跟符合条件之后执行的程序,可以放在[]之后,用;分隔.也可以换行写入, 就不需要“;”了. 比如:

  • PHP+shell脚本操作Memcached和Apache Status的实例分享

    memcached 进程启动及监控 1.memcached_inc.sh 设置路径,端口等讯息. #!/bin/sh #config include HOST=$(hostname) SITE="mysite" PORT=11211 MEMCACHED_PID_FILE="/tmp/memcached.pid" MEMCACHED_DAEMON_PID_FILE="/tmp/memcached_daemon.pid" MEMCACHED=&quo

  • shell脚本实现快速生成xml格式sitemap实例分享

    用shell快速生成xml格式的sitemap地图文件,中小型网站适用.在本次案例中,生成12053条URL的sitemap文件,仅用时4.3秒!shell代码如下: 复制代码 代码如下: cat sitemap.txt|awk 'BEGIN{print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset>"}{print "<url>\n<

  • shell脚本echo输出不换行功能增强实例

    这是第8/101个脚本 There are as many ways to solve this quirky echo problem as there are pages in this book. One of my favorites is very succinct: function echon { echo "$*" | awk '{ printf "%s" $0 }' } You may prefer to avoid the overhead in

  • Shell脚本中管道的几种使用实例讲解

    管道经常用于拼接命令,通过管道可以执行一些复杂的数据处理操作.以下为在shell中使用管道处理数据的的几个实例 示例1:生成一个8位的随机密码 tr -dc A-Za-z0-9_ </dev/urandom | head -c 8 | xargs 示例2:查看系统中所有的用户名称,并按字母排序 awk -F: '{print $1}' /etc/passwd | sort 示例3:列出当前用户使用最多的5个命令(print的列数根据实际情况而定) history | awk '{print $2

  • Shell脚本检查IP格式及mysql操作实例

    还是cronjob的一部分,就是在Rails的定时任务里,后台交互运行 CheckIPAddress() { echo $1 |grep "^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$" > /dev/null if [ $? = 1 ]; then return 1 else a=`echo $1 | awk -F. '{print $1}'` b=`echo $1 | awk -F. '{print $2}'

  • Shell脚本编程中常用的数学运算实例

    这部分主要讨论数学相关的shell脚本编程. 加法运算 新建一个文件"Addition.sh",输入下面的内容并赋予其可执行的权限. 复制代码 代码如下: #!/bin/bash echo "Enter the First Number: " read a echo "Enter the Second Number: " read b x=$(expr "$a" + "$b") echo $a + $b =

随机推荐