Shell中的数值计算

#!/bin/bash

echo "please input number:"

read n

a=`expr $n / 100`

#a1=`expr $n - $a * 100`

b=`echo "($n-$a*100)/10" | bc`

c=`echo "($n-$a*100-$b*10)" | bc`

d=`echo "$c*100+$b*10+$a" | bc`

echo $d

转:http://bbs.techrepublic.com.cn/viewthread.php?tid=140425

1.对某个数加一

$ i=0;

$ ((i++))

$ echo $i

1

$ let i++

$ echo $i

2

$ expr $i + 1

3

$ echo $i

2

$ echo $i 1 | awk ‘{printf $1+$2}‘

let i++;

i=$(expr $i + 1)

i=$(echo $i+1|bc)

i=$(echo "$i 1" | awk ‘{printf $1+$2;}‘)

2.用time统计脚本运行时间

$ time calc.sh

10000

real    0m1.319s

user    0m1.056s

sys     0m0.036s

$ time calc_let.sh

3.用shell的内置命令查看各个命令的类型如下:

$ type type

type is a shell builtin

$ type let

let is a shell builtin

$ type expr

expr is hashed (/usr/bin/expr)

$ type bc

bc is hashed (/usr/bin/bc)

$ type awk

awk is /usr/bin/awk

4.let,expr,bc都可以用来求模,运算符都是%,而let和bc可以用来求幂,运算符不一样,前者是**,后者是^

//求模

$ expr 5 % 2

1

$ let i=5%2

$ echo $i

1

$ echo 5 % 2 | bc

1

$ ((i=5%2))

$ echo $i

1

//求幂

$ let i=5**2

$ echo $i

25

$ ((i=5**2))

$ echo $i

25

$ echo "5^2" | bc

25

5.浮点预算,let和expr都无法进行浮点运算,但是bc和awk可以。

例一:

$ echo "scale=3; 1/13"  | bc

.076

$ echo "1 13" | awk ‘{printf("%0.3f\n",$1/$2)}‘

0.077

例二:

$ echo 1/13100 | bc -l

.00007633587786259541

例三:假如有这样一组数据,存放有某个村庄所有家庭的人数和月总收入,要求找 出人均月收入最高的家庭。文件名为innode

1 3 4490

2 5 3896

3 4 3112

4 4 4716

5 4 4578

6 6 5399

7 3 5089

8 6 3029

9 4 6195

10 5 5145

注:通过下面脚本产生上面三列随机数:

for i in $(seq 1 10);do echo $i $(($RANDOM/8192+3)) $((RANDOM/10+3000));done

说明:上面的三列数据分别是家庭编号、家庭人数、家庭月总收入。

分析:为了求出月均收入最高的家庭,我们需要对后面两列数进行除法运算,即求出每个家庭的月均收入,然后按照月均收入排序,找出收入最高的家庭。

#!/bin/bash

# gettopfamily.sh

[ $# -lt 1 ] && echo "please input the file who store the income data" && exit -1[ ! -f $1 ] && echo "$1 is not a file" && exit -1income=$1awk ‘{        printf("%d %0.2f\n", $1, $3/$2);}‘ $income | sort -k 2 -n -r

6.产生一个随机数

环境变量RANDOM产生0到32767的随机数,而awk的rand函数可以产生0到1之间的随机数。

例一:

$ echo $RANDOM

81

$ echo "" | awk ‘{srand(); printf("%f", rand());}‘

0.237788

说明:srand在无参数时,采用当前时间作为rand随机数产生器的一个seed

7.统计某篇文章中单词出现的个数:

cat text | sed -e "s/[^a-zA-Z]/\n/g" | grep -v ^$ | sort | uniq -c

8.统计出出现频率最高的前10个单词

cat text | sed -e "s/[^a-zA-Z]/\n/g" | grep -v ^$ | sort | uniq -c | sort -n -k 1 -r | head -10

说明:

cat text: 显示text文件里的内容

sed -e "s/[^a-zA-Z]/\n/g": 把非字母的字符全部替换成空格,这样整个文本只剩下字母字符

grep -v ^$:去掉空行

sort: 排序

uniq -c:统计相同行的个数,即每个单词的个数

sort -n -k 1 -r:按照第一列(-k 1)的数字(-n)逆序(-r)排序

head -10:取出前十行

9.统计文章里含有的指定单词的数量

代码一

#!/bin/bash

# statistic_words.sh

if [ $# -lt 1 ]; then

echo "ERROR: you should input 2 words at least";

echo "Usage: basename $0 FILE WORDS ...."

exit -1

fi

FILE=$1

((WORDS_NUM=$#-1))

for n in $(seq $WORDS_NUM)

do

shift    cat $FILE | sed -e "s/[^a-zA-Z]/\n/g" | grep -v ^$ | sort | grep ^$1$ | uniq -c

done

代码二

#!/bin/bash

# statistic_words.sh

if [ $# -lt 1 ]; then

echo "ERROR: you should input 2 words at least";

echo "Usage: basename $0 FILE WORDS ...."

exit -1

fi

FILE=$1

((WORDS_NUM=$#-1))

for n in $(seq $WORDS_NUM)

do

shift    cat $FILE | sed -e "s/[^a-zA-Z]/\n/g" | grep -v ^$ | sort | uniq -c | grep " $1$"

done

说明:很明显,采用第一种办法效率要高很多,因为第一种办法提前找出了需要统计的单词,然后再统计,而后者则不然。实际上,如果使用grep的-E选项, 我们无须引入循环,而用一条命令就可以搞定:

$ cat text | sed -e "s/[^a-zA-Z]/\n/g" | grep -v ^$ | sort | grep -E "^Action$|^is$" | uniq

-c

或者

$ cat text | sed -e "s/[^a-zA-Z]/\n/g" | grep -v ^$ | sort | egrep  "^Action$|^is$" | uniq

-c

补充:

在《高级Bash脚本编程指南》一书中还提到jot命令和factor命令

factor产生一个数的所有素数

时间: 2024-11-09 00:03:20

Shell中的数值计算的相关文章

在shell中做数值计算

shell自带的计算符号只能计算整数例如:echo $[1+1]echo $((1+2))还有let命令,expr命令但是都并不好用,只能进行整数的运算,如果要计算小数,可以使用bc命令工具另外其实除了bc,还可以使用awk来进行数值计算,功能更加强大,而且方便,因为awk本身就是一门编程语言,主要用于对文本的处理,对数据的处理自然不在话下!要想使用awk计算,建议使用BEGIN模式,熟悉awk的人知道awk的命令行语法是这样的:awk [选项] 'BEGIN{执行语句...}{执行语句...}

二、Shell中的变量

变量是任何程序或脚本的重要组成部分.变量为程序或脚本访问内存中的可被修改的一块数据提供了简单的方式.Linux Shell中的变量可以被指定为任意的数据类型.Shell中有两种变量的类型:系统变量(环境变量)和用户自定义的变量(本地变量或Shell变量). 环境变量:作用域为当前shell进程及其子进程:环境变量一般均为大写.常用的环境变量有: 系统变量 含义 BASH_VERSION 保存bash实例的版本 DISPLAY 设置X display名字 EDITOR 设置默认的文本编辑器 HIS

shell中的计算

shell中变量的数值计算常见的命令 (()).let.expr.bc.$[] 一.(()) 示例:     [[email protected] ~]# echo $((1+2))     3 二.let 示例:     [[email protected] ~]# let a=1+2     [[email protected] ~]# echo $a     3 三.expr 示例: 1.     [[email protected] ~]# expr 1+2     1+2     [[

如何在Shell 中正确的传递函数返回值

Debug 的过成比较无聊,所以这里先上结论和示例,Debug 的笔记看不看并没有什么乱用. 结论 在shell 中使用返回值,唯一具有通用性的方法是使用全局变量,或者使用echo 并在父进程中接收. return 语句不能用来传递计算结果--return 语句是用来传递函数退出状态的,在几乎所有情况下,你的计算结果都不会是退出状态! 任何违反上面规则的shell 脚本,都不具有通用性. 示例 #!/usr/bin/env bash # =============================

Shell中的变量

1.常用系统变量 $HOME.$PWD.$SHELL.$USER 家目录.当前目录.默认解释器.当前用户 显示当前Shell中所有变量:set 2.自定义变量 2.1.基本语法 (1)定义变量:变量=值    等号左右没有空格 (2)撤销变量:unset 变量 (3)声明静态变量:readonly 变量,注意:不能unset,不能改变值 2.2变量定义规则 (1)变量名称可以由字母.数字和下划线组成,但是不能以数字开头,环境变量名建议大写. (2)等号两侧不能有空格. (3)在bash中,变量默

linux在shell中获取时间

获得当天的日期 date +%Y-%m-%d 输出: 2011-07-28 将当前日期赋值给DATE变量DATE=$(date +%Y%m%d) 有时候我们需要使用今天之前或者往后的日期,这时可以使用date的 -d参数 获取明天的日期 date -d next-day +%Y%m%d 获取昨天的日期 date -d last-day +%Y%m%d 获取上个月的年和月 date -d last-month +%Y%m 获取下个月的年和月date -d next-month +%Y%m 获取明年

在 shell 中使用 vi 模式

作为一名大型开源社区的参与者,更确切地说,作为 Fedora 项目的成员,我有机会与许多人会面并讨论各种有趣的技术主题. 我最喜欢的主题是"命令行"或者说 shell,因为了解人们如何熟练使用 shell 可以让你深入地了解他们的想法,他们喜欢什么样的工作流程,以及某种程度上是什么激发了他们的灵感. 许多开发和运维人员在互联网上公开分享他们的" dot 文件"(他们的 shell 配置文件的常见俚语),这将是一个有趣的协作机会,让每个人都能从对命令行有丰富经验的人中

shell中的重定向(输入输出)

注意:不同版本的Linux会有所区别,不过大同小异 Linux 命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示.一般情况下,标准输入设备就是键盘,标准输出设备就是终端,即显示器. 输出重定向 命令的输出不仅可以是显示器,还可以很容易的转移向到文件,这被称为输出重定向. 命令输出重定向的语法为: $ command > file 这样,输出到显示器的内容就可以被重定向到文件. 例如,下面的命令在显示器上不会看到任何输出: $ who > users 打

书写优雅的shell脚本(五)- shell中(())双括号运算符

在使用shell的逻辑运算符"[]"使用时候,必须保证运算符与算数之间有空格. 四则运算也只能借助:let,expr等命令完成. 今天讲的双括号"(())"结构语句,就是对shell中算数及赋值运算的扩展. 1.语法: ((表达式1,表达式2-)) 2.特点: (1)在双括号结构中,所有表达式可以像c语言一样,如:a++,b--等. (2)在双括号结构中,所有变量可以不加入:"$"符号前缀. (3)双括号可以进行逻辑运算,四则运算 (4)双括号结