linux中求和/平均值/最值

匿名 (未验证) 提交于 2019-12-02 21:56:30

求和、平均值、最值

[root@redis-server1 ~]# cat a 1 2 3 4 5 2333 

0)求和

[root@redis-server1 ~]# awk '{a+=$1}END{print a}' a 2348 

1)求最大值

[root@redis-server1 ~]# awk '$0>a{a=$0}END{print a}' a 2333 

2)求最小值(思路:先定义一个最大值)

[root@redis-server1 ~]# awk 'BEGIN{a=9999999}{if($1<a) a=$1 fi}END{print a}' a 1 

3)求平均值
第一种方法:在上面求和的基础上,除以参数个数

[root@redis-server1 ~]# awk '{a+=$1}END{print a/NR}' a 391.333 

第二种方法:写脚本

[root@redis-server1 ~]# cat avg.sh  1 2 3 4 5 6 #!/bin/bash let sum=0 for num in $*;do let sum=$sum+$num done echo "scale=3;$sum/$#"|bc  [root@redis-server1 ~]# chmod 755 avg.sh [root@redis-server1 ~]# ./avg.sh `cat a` 391.333  [root@redis-server1 ~]# ./avg.sh 40 45 60 48.333 


$? 上一个命令结果的返回值,0是正确,非0是错误的
$0 当前程序名
$n 命令行参数,比如$1是第一个参数,$2是第二个参数,$3是第三个参数…
$# 命令行参数的个数
$* 格式形如$1 $2 $3 $4 … $n
$@ 格式形如"$1" “$2” “$3” “4&quot;...&quot;4&quot; ... &quot;n”


示例一

[root@redis-server1 ~]# cat a.txt A 88 B 78 B 89 C 44 A 98 C 433 

取得结果为:[root@redis-server1 ~]# cat a.txt|awk -F" " ‘{print $1}’|sort|uniq
A
B
C

第一种方法:

[root@redis-server1 ~]# cat a.txt|awk -F" " '{print $1}'|sort|uniq  A B C  [root@redis-server1 ~]# for i in `cat a.txt|awk -F" " '{print $1}'|sort|uniq`;do cat a.txt|grep $i|xargs;done  A 88 A 98 B 78 B 89 C 44 C 433  [root@redis-server1 ~]# for i in `cat a.txt|awk -F" " '{print $1}'|sort|uniq`;do cat a.txt|grep $i|xargs;done|awk '{print $1,$2,$4}' A 88 98 B 78 89 C 44 433  [root@redis-server1 ~]# for i in `cat a.txt|awk -F" " '{print $1}'|sort|uniq`;do cat a.txt|grep $i|xargs;done|awk -F" " '{print $1":",$2":",$4}' A: 88: 98 B: 78: 89 C: 44: 433 

第二种方法:

[root@redis-server1 ~]# awk '{a[$1]=a[$1]" "$2}END{for(i in a)print i,a[i]}' a.txt |awk '{print $1":",$2";",$3}' A: 88; 98 B: 78; 89 C: 44; 433 

示例二

[root@redis-server1 ~]# cat b.txt 123 444 23 888 455 45 55 367 66 100 77 89 

对上面b.txt文件里的两列数字分别求和,求平均值

[root@redis-server1 ~]# awk '{a+=$1;b+=$2}END{print a,b}' b.txt 799 1933 [root@redis-server1 ~]# awk '{a+=$1;b+=$2}END{print a":",b}' b.txt 799: 1933 [root@redis-server1 ~]# awk '{a+=$1;b+=$2}END{print a":"b}' b.txt 799:1933  [root@redis-server1 ~]# awk '{a+=$1;b+=$2}END{print a/NR,b/NR}' b.txt 133.167 322.167 [root@redis-server1 ~]# awk '{a+=$1;b+=$2}END{print a/NR":",b/NR}' b.txt 133.167: 322.167 [root@redis-server1 ~]# awk '{a+=$1;b+=$2}END{print a/NR":"b/NR}' b.txt 133.167:322.167 

paste 命令将多个文件合并

[root@redis-server1 ~]# cat aa.txt  11 22 33 44 55 [root@redis-server1 ~]# cat bb.txt  aa ab ac cc cd  [root@redis-server1 ~]# paste aa.txt bb.txt 11	aa 22	ab 33	ac 44	cc 55	cd [root@redis-server1 ~]# paste -d":" aa.txt bb.txt 11:aa 22:ab 33:ac 44:cc 55:cd [root@redis-server1 ~]# paste -d"-" aa.txt bb.txt 11-aa 22-ab 33-ac 44-cc 55-cd 

使用awk排除第一行和第二行的数据

如查看本机所有进程cpu的百分比总和

[root@kevin ~]# ps auxw|awk '{print $3}' %CPU 0.0 0.0 0.0 0.0  .... 1.2 0.0 0.0    [root@kevin ~]# ps auxw|awk '{print $3}'|wc -l 145 

由于第一行有"%CPU",所以需要将结果中的第一行字符去掉

[root@kevin ~]# ps auxw|awk '{if (NR>1){print $4}}' ..... 0.0 0.0 0.0 0.0 .... 1.2 0.0 0.0    [root@kevin ~]# ps auxw|awk '{if (NR>1){print $4}}'|wc -l 144 

如果是去掉结果中的第一行,第二行和第三行,则只需要"NR>3"即可

[root@kevin ~]# ps auxw|awk '{if (NR>2){print $4}}' 

示例:条件判断

[root@master-node ~]# cat aa.txt 123 root 345 wangshibo 456 opt 789 nginx 100 wangshibo 200 huanqiu 300 hqtime 

打印aa.txt文件中第二列包含wang字符的内容

[root@master-node ~]# awk '$2~/wang/ {print $0}' aa.txt 345 wangshibo 100 wangshibo 

打印aa.txt文件中第二列不包含wang字符的内容

[root@master-node ~]# awk '$2 !~/wang/ {print $0}' aa.txt 123 root 456 opt 789 nginx 200 huanqiu 300 hqtime 

打印aa.txt文件中第二列以wang字符开头的内容

[root@master-node ~]# awk '$2~/^wang/ {print $0}' aa.txt 345 wangshibo 100 wangshibo 

打印aa.txt文件中第二列以bo字符结尾的内容

[root@master-node ~]# awk '$2~/bo$/ {print $0}' aa.txt 345 wangshibo 100 wangshibo 

打印aa.txt文件中第二列是wangshibo的内容(精确匹配)

[root@master-node ~]# awk '$2=="wangshibo" {print $0}' aa.txt 345 wangshibo 100 wangshibo 

打印aa.txt文件中第二列不是wangshibo的内容

[root@master-node ~]# awk '$2!="wangshibo" {print $0}' aa.txt 123 root 456 opt 789 nginx 200 huanqiu 300 hqtime 

打印aa.txt文件中第一列数字大于500的内容

[root@master-node ~]# awk '$1>500 {print $0}' aa.txt 789 nginx 

打印aa.txt文件中第一列数字大于500且第二列是wangshibo的内容

[root@master-node ~]# awk '$1<200 && $2=="wangshibo" {print $0}' aa.txt 100 wangshibo 

打印aa.txt文件中第一列数字大于500或是第二列是wangshibo的内容

[root@master-node ~]# awk '$1<200 || $2=="wangshibo" {print $0}' aa.txt 123 root 345 wangshibo 100 wangshibo 

示例:输入几个数,自动计算出最大值,最小值,总和

[root@test2 ~]# cat test1.sh #!/bin/bash #任意输入5个数,判断最大值,最小值,总和   s=0 read -p "please input:" num   s=$(($s+$num)) max=$num min=$num for i in `seq 4` do       read -p "please input:" num       s=$(($s+$num))               if [ $num -le $min ];then         min=$num       fi         if [ $num -ge $max ];then          max=$num       fi   done echo sum:$s max:$max min:$min   [root@test2 ~]# /bin/bash test1.sh please input:12 please input:13 please input:14 please input:15 please input:16 sum:70 max:16 min:12 

[root@test2 ~]# cat test2.sh #!/bin/bash #任意输入3个数,判断最大值,最小值,总和   s=0 n=0 for i in `seq 3` do       read -p "please input:" num        expr  ${num}  +  0  1>/dev/null  2>&1         if   [   $?   -eq   0   ];then          echo   "${num}   is   a   number!"          else          echo   "${num}   is   not   a   number!"         exit         fi                     s=$(($s+$num))       [ $n -eq 0 ] && max=$num && min=$num       n=$(($n+1))                if [ $num -le $min ];then         min=$num       fi         if [ $num -ge $max ];then          max=$num       fi   done echo sum:$s max:$max min:$min n:$n 

另一种吧:

[root@test2 ~]# /bin/bash test2.sh please input:123 123   is   a   number! please input:567 567   is   a   number! please input:512 512   is   a   number! sum:1202 max:567 min:123 n:3 
文章来源: https://blog.csdn.net/Nikki0126/article/details/90714363
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!