LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: spqbupt

请问awk中的浮点数据结果如何导出到外部变量?[脚本解决]

[复制链接]
发表于 2004-6-23 22:50:46 | 显示全部楼层
其实在第一个awk的END{}输出均值到管道,第二个awk将其保存为变量,内部再次打开文件,逐行减去均值变量即可。
这个过程符合我上面所述阿。我不知道是不是我的表达能力有问题。

给出算法以及样本数据来。我帮你算算看。

ps:是概率的均值与方差吗?
 楼主| 发表于 2004-6-24 08:40:26 | 显示全部楼层
最初由 home_king 发表
其实在第一个awk的END{}输出均值到管道,第二个awk将其保存为变量,内部再次打开文件,逐行减去均值变量即可。
这个过程符合我上面所述阿。我不知道是不是我的表达能力有问题。

呵呵,这回是彻底明白了,你的表达没有问题,是我一直觉得awk用了管道输入数据以后就不能再有别的数据源了。我不会在awk里面打开文件
发表于 2004-6-24 08:48:24 | 显示全部楼层
最初由 home_king 发表

awk可以拥有多种数据源,可以打开多个文件,也可以同时接受标准输入,更可以同时获取环境变量,足以满足你的需求。

晕~~~我早已说过了。

ps:建议买本O'reilly的《sed与awk》来看,我当时和学bash一样,两天入门。

[php]
while( (getline item < "datafile") > 0 ){
        print item
        #item保存了文件输入的每一行
        #当然,你也可以用split函数把它拆分为数组来细化处理
}
[/php]
 楼主| 发表于 2004-6-24 09:20:48 | 显示全部楼层
最初由 home_king 发表
晕~~~我早已说过了。

ps:建议买本O'reilly的《sed与awk》来看,我当时和学bash一样,两天入门。


我的理解错误

我的书里面没有说到在awk里面打开文件的啊
怎么个做法您给个痛快的说法吧
过两天去买书

ps:
END{print "avg",var}}' inputfile > awk '/^avg/ {b=$2} {是在这个地方打开文件?}'
发表于 2004-6-24 11:29:50 | 显示全部楼层
其实不需要再次导入文件, getline可以读取pipe出来的变量. awk又可以引用外部变量,所以应该可以直接用. 比如:

  1. str="11 22"
  2. echo $str|awk 'BEGIN{RS=" "}{for(i=1;i<=NF;i++)total += $i};END{print total}' | awk '{getline total}{print $total}'
复制代码
发表于 2004-6-24 12:50:10 | 显示全部楼层
晕,究竟你有没有看我的回帖。
上面不是就有一个程序吗!!!

要不,你把你的程序完整地给出来,我帮你补充!
发表于 2004-6-24 22:29:57 | 显示全部楼层
写了一个试试:

  1. str=“11 22”
  2. IFS=;echo $str | awk '{for(i=1;i<=NF;i++)total+=$i};END{print total,"'$str'"}' | awk '{getline};{for(i=2;i<=NF;i++)avg=$i-$1};{print avg}'
复制代码

问题是不知为什么只能print出最后一个avg?
发表于 2004-6-24 22:56:17 | 显示全部楼层
平均值应该这样算呀

  1. awk '{for(i=1;i<=NF;i++)sum+=$i;printf "%.2f\n", sum/NF}'
复制代码
 楼主| 发表于 2004-6-25 17:19:12 | 显示全部楼层
问题解决了,谢谢教主帮忙,尤其下面一帖(刚开始不知为什么没有看到源码,所以让教主多晕了一次,不好意思):thank
学习心得汇报一下
用于Xgraph的数据文件格式如下:
每个文件中包含多组数据,各组之间由空行和'"数组说明' 分割开来,要求分别求出每一组中第二列的均值和标准差,拟一简单数据文件如下
[php]
[spq@localhost code]$ cat del.tr
Titletext: test for calculation

"delay for cbr
0 1
0 2
0 2
0 3
0 2
0 2
  
"delay for ubr
0 1
0 1
0 5
0 6
0 1
[/php]
根据各位的教导,我的脚本:
[php]  
[spq@localhost code]$ cat avdelay.sh
#!/bin/bash
awk '
/^"/{if (total != 0) {print total/n; total=0; n=0 }; print $3}
/^[0-9]+/ {total = total + $2; n=n+1}
END {print total/n; }' del.tr |
awk '
BEGIN {print "Average Delay:"}
$1 ~/^[0-9]+/ {i=i+1; A=$1; print A}
$1 !~/^[0-9]+/ {printf "%s\t",$1}
END {
print "Delay Varietion (Standard Deviation of delay sample)"
nss=0;n=0;i=0
while ((getline item <"del.tr">0)) {
split (item,X)
if (X[1]~/"/) {i=i+1;if (nss!=0) {printf "\t%f\n",sqrt(nss/n); nss=0; n=0}; printf X[3]}
if (X[1]~/[0-9]+/){nss=(X[2]-A)^2+nss; n=n+1}
}
printf "\t%f\n",sqrt(nss/n)
}'
[spq@localhost code]$ ./avdelay.sh
Average Delay:
cbr     2
ubr     2.8
Delay Varietion (Standard Deviation of delay sample)
cbr     0.577350
ubr     2.227106
[/php]

最初由 home_king 发表
晕~~~我早已说过了。

ps:建议买本O'reilly的《sed与awk》来看,我当时和学bash一样,两天入门。

[php]
while( (getline item < "datafile") > 0 ){
        print item
        #item保存了文件输入的每一行
        #当然,你也可以用split函数把它拆分为数组来细化处理
}
[/php]
发表于 2004-6-25 19:27:35 | 显示全部楼层
祝贺!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表