免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 15657 | 回复: 14
打印 上一主题 下一主题

[数值计算] shell 求某一列的中值,标准差,最大值,最小值 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-02-25 17:00 |只看该作者 |倒序浏览
我学shell快一个月了,主要想用来处理一些文本,确实挺方便的。但我用shell来计算中值,标准差,最大值,最小值这些常见的统计量,发现挺不方便的。
像我如果要计算第二列的这些统计量,有什么简单的方法吗。
cat data|awk 'BEGIN {max = 0} {if ($2>max) max=$2 fi} END {print "Max=", max}'[/code]
这个令从网上抄下来的,这个“fi”是什么意思?其他几个统计量怎么求?有内置的函数之类吗,有可能问题比较白痴,希望大家能谅解,我也一直在恶补相关知识,谢谢了。

162616.5347586470       87367.4899084031
85181.9193508478        115419.9635060868
128583.9942762910       102857.0688335032
171259.8270212160       130301.9875994774
148783.9678689920       128483.8809052336
93168.6444210467        129336.0618793606
110496.2277431580       123883.6186766724
174233.2178257970       150691.5762701073
136478.9755860420       157927.8243340223
161632.3055155560       121767.1137681215
133953.8764284690       176559.0927623106
168696.1419453560       185411.2571383122
129933.4663808970       148160.8502728328
283201.8596277380       205012.4679922750
147516.3518521880       197898.2265649752

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
2 [报告]
发表于 2014-02-25 17:09 |只看该作者
有现成的函数吗?没有的话,标准差这种
只能通过平均数自己算了,用Shell做这种
复杂的运算,合适吗?

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
3 [报告]
发表于 2014-02-25 17:14 |只看该作者
本帖最后由 jason680 于 2014-02-25 17:30 编辑

回复 1# pdzcowboy

$ awk '{v[NR]=$2;sum+=$2}{if($2>max)max=$2;if(min>$2)min=$2}NR==1{max=min=$2}END{avg=sum/NR;for(n=1;n<=NR;n++)sd+=(v[n]-avg)**2;sd=sqrt(sd/NR);printf("Max=%f\nMin=%f\nSum=%f\nAvg=%f\nSD=%f\nItem=%d\n",max,min,sum,avg,sd,NR)}' data
Max=205012.467992
Min=87367.489908
Sum=2161078.480412
Avg=144071.898694
SD=33583.438884
Item=15


   
Note: fi for shell script with if function, not for awk

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
4 [报告]
发表于 2014-02-25 17:14 |只看该作者
回复 1# pdzcowboy


   这么复杂的统计 还是找个脚本 语言处理,python  ,都很好,

另外你说fi是 shell中 有这种语法 if fi    成对出现 ,至于awk的 if没见过这么写的,貌似也没别的啥意思

论坛徽章:
0
5 [报告]
发表于 2014-02-25 17:15 |只看该作者
awk '{sum=sum+$2}END{printf sum/NR "\n"}' date
显示平均值
cat date|awk '{printf $2"\n"}'|sort|sed -n '1p'
显示最大值,排序一下,取第一行值
cat date|awk '{printf $2"\n"}'|sort|sed -n '$p'
显示最小值,先排序一下,取最尾值

论坛徽章:
7
亥猪
日期:2013-10-10 17:00:29辰龙
日期:2013-10-12 16:23:19卯兔
日期:2013-11-18 17:01:27金牛座
日期:2014-09-09 10:17:052015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之柏太阳神
日期:2015-09-25 13:56:42数据库技术版块每日发帖之星
日期:2016-08-06 06:20:00
6 [报告]
发表于 2014-02-25 17:17 |只看该作者
本帖最后由 li0924 于 2014-02-25 17:18 编辑

至于标准差忘记是什么了。这里求最大值和最小值
  1. awk 'NR==1{max=min=$2;next}{max=max>$2?max:$2;min=min<$2?min:$2}END{print max,min}'
复制代码
你其中的fi;那个是shell的语法;跟awk的语法弄混淆了。

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
7 [报告]
发表于 2014-02-25 17:18 |只看该作者
标准差这些这么专业的就应该找专业的工具处理,awk没有这类函数~

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
8 [报告]
发表于 2014-02-25 17:29 |只看该作者
至于呢个fi经过大家讨论,是一个 无效的 变量,对于程序无影响 ,可以换成 其它字符串

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
9 [报告]
发表于 2014-02-25 18:08 |只看该作者
@jason680@pdzcowboy

刚刚用 ideone 这个在线工具测了一下,这个是结果

http://ideone.com/o320AX

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
10 [报告]
发表于 2014-02-25 18:20 |只看该作者
本帖最后由 Herowinter 于 2014-02-25 18:28 编辑

回复 6# li0924

如果我没记错的话,标准差应该这样的。
假设有3个数据a1, a2, a3, 平均值avg
标准差=sqrt( ((a1-avg)^2+(a2-avg)^2+(a3-avg)^2)/3)
用来表示样本离散程度的一个参数。

不过,我也不大确定了,本科做物理实验计算
误差是用得比较多;但那个时候我们算出来数据
误差过大就回头改数据,想想真是欢乐。


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP