[转载]使用awk进行数字计算,保留指定位小数

对于在Shell中进行数字的计算,其实方法有很多,但是常用的方法都有其弱点:

 

1、bc

    bc应该是最常用的Linux中计算器了,简单方便,支持浮点。

[wangdong@centos715-node1 ~]$ echo 1+2 |bc
3
[wangdong@centos715-node1 ~]$ echo 5.5*3.3 |bc
18.1
[wangdong@centos715-node1 ~]$ echo 5/3 |bc
1
[wangdong@centos715-node1 ~]$ echo "scale=2;5/3" |bc
1.66

    看似在简单计算时候完美的bc,其实也有一个让我抓狂的地方,当然有可能有办法可以解决,只是我不知道而已,那就是…… 在出现整数部分为0的时候,这个0是不显示出来的,例如0.5只会显示为.5,情何以堪!

[wangdong@centos715-node1 ~]$ echo "scale=2;1/2" |bc
.50
[wangdong@centos715-node1 ~]$ echo "scale=4;17/20" |bc    
.8500

    而且…… 像一些第三方基于Linux底层的产品,为了系统本身的稳定和轻便,默认是不带bc的,例如……F5

 

2、expr

    不支持浮点计算,即不支持小数,所以也常被用来判断变量内容或者结果是不是非0整数(expr 0的echo $?不是0)。

[wangdong@centos715-node1 ~]$ expr 3 + 5
8
[wangdong@centos715-node1 ~]$ expr 10 / 2
5
[wangdong@centos715-node1 ~]$ expr 10 / 3
3
[wangdong@centos715-node1 ~]$ expr 7 / 2
3
[wangdong@centos715-node1 ~]$ expr 0
0
[wangdong@centos715-node1 ~]$ echo $?
1


3、$(())

    不支持浮点计算。

[wangdong@centos715-node1 ~]$ echo $((8+3))
11
[wangdong@centos715-node1 ~]$ echo $((10/2))
5
[wangdong@centos715-node1 ~]$ echo $((10/3))
3
[wangdong@centos715-node1 ~]$ echo $((1.5*3))
-bash: 1.5*3: 语法错误: 无效的算术运算符 (错误符号是 ".5*3")

 

4、let

    不仅不支持浮点计算,而且还只能赋值,不能直接输出。

[wangdong@centos715-node1 ~]$ let a=1+2
[wangdong@centos715-node1 ~]$ echo $a
3
[wangdong@centos715-node1 ~]$ let b=10/5
[wangdong@centos715-node1 ~]$ echo $b
2
[wangdong@centos715-node1 ~]$ let c=1.5*3
-bash: let: c=1.5*3: 语法错误: 无效的算术运算符 (错误符号是 ".5*3")
[wangdong@centos715-node1 ~]$ echo $c
[wangdong@centos715-node1 ~]$

 

上面的几种方式,是我之前常用的方式,但是现在我在shell脚本中有一个需求,在计算数字时,会出现浮点计算,也会出现0-1之间的小数,前面的几个方式恐怕都无法满足。

 

    这里,我使用的是awk计算:

[wangdong@centos715-node1 ~]$ echo | awk '{print 17/20}'
0.85
[wangdong@centos715-node1 ~]$ echo | awk '{print 1.5*3}'
4.5

    看上去还可以,那么进一步,我需要带变量:

[wangdong@centos715-node1 ~]$ A=5
[wangdong@centos715-node1 ~]$ B=16
[wangdong@centos715-node1 ~]$ C=29
[wangdong@centos715-node1 ~]$ echo | awk '{print $A/$B}'
awk: cmd. line:1: (FILENAME=- FNR=1) fatal: division by zero attempted
[wangdong@centos715-node1 ~]$ echo | awk "{print $A/$B}" 
0.3125
[wangdong@centos715-node1 ~]$ echo | awk "{print $C*$A}"
145
[wangdong@centos715-node1 ~]$ echo | awk "{print $C*$A/$B}"
9.0625

    看上去也还可以,只是注意awk后的单引号需要变为双引号。

    再进一步,上面最后一次的计算,小数点后面出现了4位,我希望只保留两位,不然看着太乱。但是没有找到这里可以保留小数位的参数和方法,于是我尝试一下将print换为printf:

[wangdong@centos715-node1 ~]$ echo | awk '{print 10/3}'
3.33333
[wangdong@centos715-node1 ~]$ echo | awk '{printf ("%.2f\n",10/3)}' 
3.33

    将print换成printf,就可以有方法进行小数位的限制了,看似不错,但是……

[wangdong@centos715-node1 ~]$ A=5
[wangdong@centos715-node1 ~]$ B=16
[wangdong@centos715-node1 ~]$ C=29
[wangdong@centos715-node1 ~]$ echo | awk '{printf ("%.2f\n",$A/$B)}'
awk: cmd. line:1: (FILENAME=- FNR=1) fatal: division by zero attempted
[wangdong@centos715-node1 ~]$ echo | awk "{printf ("%.2f\n",$A/$B)}" 
awk: cmd. line:1: {printf (%.2fn,5/16)}
awk: cmd. line:1:          ^ syntax error
[wangdong@centos715-node1 ~]$ echo | awk "{printf ('%.2f\n',$A/$B)}"
awk: cmd. line:1: {printf ('%.2f\n',5/16)}
awk: cmd. line:1:          ^ invalid char ''' in expression
awk: cmd. line:1: {printf ('%.2f\n',5/16)}
awk: cmd. line:1:          ^ syntax error

    使用变量参与计算的话,会发现一直在报错,这种情况,建议先在前面的echo中将需要使用的变量输出出来,再进行调用。

[wangdong@centos715-node1 ~]$ A=5
[wangdong@centos715-node1 ~]$ B=16
[wangdong@centos715-node1 ~]$ C=29
[wangdong@centos715-node1 ~]$ D=6
[wangdong@centos715-node1 ~]$ echo "$A $B $C $D" | awk '{printf ("%.2f\n",$1*$2/$3-$4)}'
-3.24
[wangdong@centos715-node1 ~]$ echo "$A $B $C $D" | awk '{printf ("%.2f\n",$1/$4)}'      
0.83
[wangdong@centos715-node1 ~]$ echo "$A $B $C $D" | awk '{printf ("%.3f\n",$1/$4)}'
0.833

    注意,使用printf的时候,awk后面必须是单引号,双引号会报错。虽然这种方法麻烦一些,但是起码可以实现我的需求,如果有朋友知道bc计算的结果为0-1之间的小数时,怎么让他显示出来前面的0. ,欢迎留言,不喜勿喷。

 

    补充,有的时候在计算数字后,会发现你的结果已经不是正常的一串数字了,而是在其中穿插了字母e或者E,这是因为数字过大,系统采用了类似于科学计数法的表达方式(正确叫法不确定,勿喷),但是如果直接使用这一串内容再去计算的话,会报错,系统会认为这是字符串而非数字,这种情况也可以使用awk进行转变,其实准确的说是printf的功能。

[wangdong@centos715-node1 uncomp]$ echo "6.8923e+08/100" |bc
(standard_in) 1: syntax error
[wangdong@centos715-node1 uncomp]$ echo "6.8923e+08" | awk '{printf ("%.0f\n",$1)}'
689230000

转载于:https://www.cnblogs.com/conanwang/p/5841764.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/542632.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dcom配置_spring cloud 二代架构依赖组件 全配置放送

一 背景介绍先来看一下我们熟悉的第一代 spring cloud 的组件spring cloud 现在已经是一种标准了,各公司可以基于它的编程模型编写自己的组件 ,比如Netflix、阿里巴巴都有自己的一套通过spring cloud 编程模型开发的分布式服务组件 。Spring Cloud 二代组…

olap 多维分析_OLAP(在线分析处理)| OLAP多维数据集和操作

olap 多维分析In the previous article of OLAP, we have seen various applications of OLAP, Various types of OLAP, advantages, and disadvantages of OLAP. In this article, we will learn about the, 在OLAP的上一篇文章中,我们了解了OLAP的各种应用&#x…

dede mysql语句_让dede运行php代码和mysql语句

一、dede运行php代码举例1:{dede:name runphpyes}$str "hello ";me $str;me . "world";{/dede:name}结果:hello world说明:"name"为任意定义的名字,me 表示当前的值,也就是要输出最后…

每周一书-2016年8月28日到9月4日获奖读者公布

每周一书-2016年8月28日到9月4日获奖读者公布 上次送出的《Bootstrap基础教程》,已经被幸运者收到了。我们先来回顾下《改善C程序代码的125个建议》活动文章下的精彩留言。 这是一段高屋建瓴的评述,足见作者对C语言的了解和热爱层度,当然也得…

c构造函数和析构函数_C ++构造函数和析构函数| 查找输出程序| 套装2

c构造函数和析构函数Program 1: 程序1&#xff1a; #include<iostream>using namespace std;class Sample{private:int X;int Y;public:Sample(int x, int y){X x;Y y;}void set(int x, int y){X x;Y y;}void print(){cout<<X<<" "<<Y&…

python map函数的作用_Python的map函数

map()是 Python 内置的高阶函数&#xff0c;它接收一个函数 f 和一个 list&#xff0c;并通过把函数 f 依次作用在 list 的每个元素上&#xff0c;得到一个新的 list 并返回。 例如&#xff0c;对于list [1, 2, 3, 4, 5, 6, 7, 8, 9] 如果希望把list的每个元素都作平方&#xf…

idea java no sdk_java - intelliJ IDEA 13错误:请选择Android SDK

java - intelliJ IDEA 13错误&#xff1a;请选择Android SDK我已经在Error: Cannot find any configured Android SDK上安装了intelliJ 12.1.2和Error: Cannot find any configured Android SDK。现在我使用intelliJ 13.0.1创建了一个空的android应用程序项目(也使用模拟器作为…

该怎样在KeyShot中进行贴图

2019独角兽企业重金招聘Python工程师标准>>> 在渲染物体的时候&#xff0c;贴图常常是不可缺少的部分&#xff0c;贴图主要用于描述对象表面的物质形态&#xff0c;构造真实世界中自然物质表面的视觉表象。不同的贴图能给人带来不同的视觉感受&#xff0c;KeyShot3D…

python淘宝cookies抢购_Python实现淘宝秒杀聚划算抢购自动提醒源码

说明 本实例能够监控聚划算的抢购按钮&#xff0c;在聚划算整点聚的时间到达时发出提醒&#xff08;音频文件自己定义位置&#xff09;并自动弹开页面&#xff08;URL自己定义&#xff09;。 同时还可以通过命令行参数自定义刷新间隔时间&#xff08;默认0.1s&#xff09;和监控…

kadane算法_使用KADANE的算法求最大子阵列和

kadane算法What is a sub-array? 什么是子阵列&#xff1f; A sub-array is basically an arrays contiguous part. For example, if we have an array of integers [1,2,3] so the sub-arrays that we can form from the given array are [1], [2] , [3] , [1,2] , [2,3] , …

java汽车油耗计算_转发一个手机油耗计算器 (java)

今天在一个汽车论坛上看见的&#xff0c;试了试&#xff0c;还真不错。比以前那个Fuel Consumption 功能要强大,虽然都是JAVA软件。小罗盘手机计算器是作者独自产品策划、美术设计、程序开发、测试发布的手机应用软件&#xff0c;是为作者的一个朋友写的&#xff0c;当然我们用…

6.dubbo常用的xml配置有哪些_【面试篇】必须掌握的Spring 常用注解

阅读文本大概需要5分钟。注解本身没有功能的&#xff0c;就和 xml 一样。注解和 xml 都是一种元数据&#xff0c;元数据即解释数据的数据&#xff0c;这就是所谓配置。本文主要罗列 Spring|Spring MVC相关注解的简介。Spring部分1、声明bean的注解Component 组件&#xff0c;没…

Linux的iptables常用配置范例(2)

iptables -F #清除所有规则 iptables -X #清除所有自定义规则 iptables -Z #各项计数归零 iptables -P INPUT DROP #将input链默认规则设置为丢弃 iptables -P OUTPUT DROP #将output链默认规则设置为丢弃 iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo …

aptitude 命令_C-命令行参数Aptitude问题与解答

aptitude 命令C programming Command Line Arguments Aptitude Questions and Answers: In this section you will find C Aptitude Questions and Answers on Command Line Arguments – Passing values with running programs, separate argument values, number of argument…

文件上传java逻辑_Java 文件上传 实例

import java.io.*;import java.util.*;import javax.servlet.*;import javax.servlet.http.*;public class Upload {private String saveDir "."; // 要保存文件的路径private String contentType ""; // 文档类型private String charset "";…

matlab数值计算pdf_Gnuplot科学绘图(九)——栅格以及方程数值解估算

Gnuplot科学绘图系列内容Gnuplot科学绘图(一)——从安装到简单函数绘图(文末有彩蛋)Gnuplot科学绘图(二)——坐标取值范围及刻度(文末有彩蛋)Gnuplot科学绘图(三)——点线风格Gnuplot科学绘图(四)——多组数据绘图Gnuplot科学绘图(五)——输出eps 图片Gnuplot科学绘图(六)——输…

dda算法_计算机图形学中的DDA(数字差分分析仪)算法

dda算法DDA(数字差分分析仪)算法 (DDA (Digital Differential Analyzer) Algorithm) In computer graphics, the DDA algorithm is the simplest algorithm among all other line generation algorithms. Here, the DDA is an abbreviation that stands for "Digital Diff…

购物商城框架java_基于jsp的购物商城-JavaEE实现购物商城 - java项目源码

基于jspservletpojomysql实现一个javaee/javaweb的购物商城, 该项目可用各类java课程设计大作业中, 购物商城的系统架构分为前后台两部分, 最终实现在线上进行购物商城各项功能,实现了诸如用户管理, 登录注册, 权限管理等功能, 并实现对各类购物商城相关的实体进行管理。该购物…

c语言++数组名【数字】_C ++程序在数组中打印所有非重复数字

c语言数组名【数字】Problem statement: Write a C program to print all the non-repeated numbers in an array in minimum time complexity. 问题陈述&#xff1a;编写一个C 程序&#xff0c; 以最小的时间复杂度将所有未重复的数字打印在数组中 。 Input Example: 输入示例…

java最接近对点及距离_最接近点对问题_分治法

一、问题描述给定平面上的n个点&#xff0c;找其中的一对点&#xff0c;使得在n个点组成的所有点对中该点对间的距离最小。二、解题思路及所选算法策略的可行性分析思路&#xff1a;利用分治法来解决问题。递归子结构求最接近点对总体可分为几个步骤&#xff1a;1、当问题规模小…