awk出现求和平均数

本文介绍如何使用Shell脚本和Python进行数据统计,包括计数、求和与平均值等操作,并提供了具体示例。

cesc 文件如下

# cat cesc 
a,1
a,2
b,3
b,4
c,2
d,5

需要获取abcd出现的次数,逗号后面数字的和及平均值。

With shell:

# grep -E ^a cesc |awk -F ',' '{sum+=$2} END {print "a, Count:" NR " Sum: " sum " Average: " sum/NR}'
a, Count:2 Sum: 3 Average: 1.5
# grep -E ^b cesc |awk -F ',' '{sum+=$2} END {print "b, Count:" NR " Sum: " sum " Average: " sum/NR}'
b, Count:2 Sum: 7 Average: 3.5
# grep -E ^c cesc |awk -F ',' '{sum+=$2} END {print "c, Count:" NR " Sum: " sum " Average: " sum/NR}'
c, Count:1 Sum: 2 Average: 2
# grep -E ^d cesc |awk -F ',' '{sum+=$2} END {print "d, Count:" NR " Sum: " sum " Average: " sum/NR}'
d, Count:1 Sum: 5 Average: 5

或者写成一个for循环,这样可移植性更好,另外,在awk中引用shell的变量有两种办法,一个是用双引号和单引号包含变量,如:”‘var'”,还有就是使用awk的-v参数提前声明,如:awk -v var=”$var”

# for i in `cat cesc |cut -d, -f1|sort|uniq`;do grep -E ^$i cesc |awk -F ',' '{sum+=$2} END {print "'$i'" " Count: " NR ", Sum: " sum ", Average: " sum/NR}';done
a Count: 2, Sum: 3, Average: 1.5
b Count: 2, Sum: 7, Average: 3.5
c Count: 1, Sum: 2, Average: 2
d Count: 1, Sum: 5, Average: 5
或者:
# for i in `cat cesc |cut -d, -f1|sort|uniq`;do grep -E ^$i cesc |awk -v i="$i" -F ',' '{sum+=$2} END {print i " Count: " NR ", Sum: " sum ", Average: " sum/NR}';done
a Count: 2, Sum: 3, Average: 1.5
b Count: 2, Sum: 7, Average: 3.5
c Count: 1, Sum: 2, Average: 2
d Count: 1, Sum: 5, Average: 5
 


With python:(python的整形除法默认地板除,只返回一个整形,可以使用from __future__ import division来实现真正的除法)

from __future__ import division
alist = []
blist = []
clist = []
dlist = []
for i in open('cesc'):
    ss = i.split(',')
    if ss[0] == 'a':
        alist.append(int(ss[1]))
    elif ss[0] == 'b':
        blist.append(int(ss[1]))
    elif ss[0] == 'c':
        clist.append(int(ss[1]))
    elif ss[0] == 'd':
        dlist.append(int(ss[1]))
print 'a, Count: ' + str(len(alist)) + ', Sum: ' + str(sum(alist)) + '. Average: ' + str(sum(alist)//len(alist))
print 'b, Count: ' + str(len(blist)) + ', Sum: ' + str(sum(blist)) + '. Average: ' + str(sum(blist)//len(blist))
print 'c, Count: ' + str(len(clist)) + ', Sum: ' + str(sum(clist)) + '. Average: ' + str(sum(clist)//len(clist))
print 'd, Count: ' + str(len(dlist)) + ', Sum: ' + str(sum(dlist)) + '. Average: ' + str(sum(dlist)//len(dlist))

AWK 求和、平均值、最值


记录几条命令:(打包当前目录下的所有文件)
ls | awk '{ print "tar zcvf "$0".tar.gz " $0|"/bin/bash" }'

(取范围)
[root@VM-202 zhuo]# echo "abc#1233+232@jjjj?===" |awk -F '[#@]' '{print $2}'
1233+232

[root@VM-202 zhuo]# echo "abc#1233+232@jjjj?===" |awk -F '[@?]' '{print $2}'
jjjj

awk '/^[^$]/ {print $0}' test.txt        匹配非空行
awk '/^[^zhuo]/ {print $0}' test.txt        匹配非包含zhuo的

替换(将:替换成#)

[root@VM-202 zhuo]# echo "zhuo:x:503:504::/home/zhuo:/bin/bash" |awk 'gsub(/:/,"#") {print $0}'
zhuo#x#503#504##/home/zhuo#/bin/bash

you.txt文档内容

1
2
3
4

列求和: cat you.txt |awk '{a+=$1}END{print a}'
列求平均值:cat you.txt |awk '{a+=$1}END{print a/NR}'
列求最大值:cat you.txt |awk 'BEGIN{a=0}{if ($1>a) a=$1 fi}END{print a}'

设定一个变量开始为0,遇到比该数大的值,就赋值给该变量,直到结束。
求最小值:cat you.txt |awk 'BEGIN{a=11111}{if ($1<a) a=$1 fi}END{print a}' 反之

_求全文的最值

例:求test.txt的最值
12 34 56 78
24 65 87 90
76 11 67 87
100 89 78 99

for i in `cat test.txt` ;do echo $i; done |sort |sed -n '1p;2p'

例2:同样是test.txt
求总和:for i in `cat you.txt`;do echo $i ;done |awk '{a+=$1}END{print a}'
________

例3:
A     88
B     78
B     89
C     44
A     98
C     433
要求输出:A:88;98
          B:78;89
          C:44;433

awk '{a[$1]=a[$1]" "$2}END{for(i in a)print i,a[i]}' test.txt |awk '{print $1":",$2";",$3}'

在 Linux 系统中,可以通过编写 Shell 脚本或 Python 程序来计算一组数字的平均值。两种方式各有优劣,Shell 脚本适合简单的数值处理和系统级操作,而 Python 提供了更丰富的数据处理能力和函数库支持。 ### 使用 Shell 脚本计算平均值 可以使用 `bash` 结合 `awk` 来实现一个简单的平均值计算脚本: ```bash #!/bin/bash # 从标准输入读取数值,并用 awk 进行求和与计数 awk ' { sum += $1; count++ } END { if (count > 0) print sum / count; }' "$@" ``` 保存为 `average.sh` 并赋予执行权限后,可以这样运行: ```bash chmod +x average.sh echo -e "10\n20\n30" | ./average.sh ``` 该脚本会读取每一行的一个数值,计算总和并除以个数得到平均值。 如果希望从文件中提取特定列进行计算,例如第二列(以逗号分隔),可以使用如下命令组合: ```bash cut -f2 -d, data.csv | ./average.sh ``` ### 使用 Python 编写平均值计算程序 Python 提供了更灵活的数据处理能力,适用于复杂场景。下面是一个基本的平均值计算脚本: ```python import sys def mean(numbers): return sum(numbers) / len(numbers) if __name__ == "__main__": data = [float(line.strip()) for line in sys.stdin if line.strip()] print(mean(data)) ``` 将上述代码保存为 `average.py` 后,可以通过以下方式运行: ```bash cat numbers.txt | python average.py ``` 也可以结合命令行参数传递数据: ```bash python -c 'import sys; from statistics import mean; print(mean([float(x) for x in sys.argv[1:]]))' 10 20 30 ``` 此外,还可以利用 Python 的 `statistics` 模块直接调用内置函数[^3]: ```bash python -c 'from statistics import mean; import sys; print(mean([float(x) for x in sys.stdin]))' < numbers.txt ``` ### 总结 - **Shell 脚本**:适用于轻量级、快速实现的任务,尤其适合与其他命令行工具配合使用。 - **Python 脚本**:功能更强大,可处理更复杂的数据结构和逻辑,推荐用于需要扩展性和精确控制的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值