分页: 2 / 3

Re: 请敎:这样功能怎么样实现

发表于 : 2012-01-30 17:10
autocup
josephyoung 写了:将C数据每组一行以空格分隔作为原始数据调用

代码: 全选

#!/usr/bin/awk -f
BEGIN{
    T=6;
    C_min=36;
    C_max=44;
    outfile=ENVIRON["HOME"]"/result.txt";
}
NF==T{
    C_sum=0;
    C_ave=0;
    for(i=1;i<=T;i++){
	if($i < C_min || $i > C_max)next;
	C_sum+=$i;
    }
    C_ave=C_sum/T;
    for(i=1;i<=T;i++)
	C_tmp+=($i-C_ave)**2;
    s=sqrt(C_tmp/(T-1))/C_ave*100;
    if(s<=2){
	printf("%s  %.2f%%\n",$0,s) >> outfile;
    }
}
以下是我的运行过程,不知道对不对。以.sh保存,并给于执行权限。在终端运行时出错了

代码: 全选

line 17: syntax error at or near *
于是我将*删除,再次运行里,终端没有任何显示,也没有输出文件到home下面

Re: 请敎:这样功能怎么样实现

发表于 : 2012-01-30 18:02
josephyoung
*是乘号,**是平方。。。
你应该这样运行:
比如你的测量数据保存为"shuju.txt",内容如下:
41 41 41 41 41 41
36 36.1 36.2 36.1 36.0 36
脚本保存为test.awk(扩展名可随意),并赋予可执行权限。
终端输入:

代码: 全选

./test.awk shuju.txt
执行完后在你的home下面会有result.txt,内容如下:
41 41 41 41 41 41 0.00%
36 36.1 36.2 36.1 36.0 36 0.23%

如果还提示那个错误应该是awk版本不一样,将第17行那两个**改为^。

Re: 请敎:这样功能怎么样实现

发表于 : 2012-01-30 18:44
xw_y_am
额。。。
shell C fortran
都有的说。。。 :em06 :em06

瓜瓜哥哪里学的fortran???

Re: 请敎:这样功能怎么样实现

发表于 : 2012-01-30 18:47
月下叹逍遥
xw_y_am 写了:额。。。
shell C fortran
都有的说。。。 :em06 :em06

瓜瓜哥哪里学的fortran???
被学的。。。

Re: 请敎:这样功能怎么样实现

发表于 : 2012-01-30 19:22
autocup
josephyoung 写了:*是乘号,**是平方。。。
你应该这样运行:
比如你的测量数据保存为"shuju.txt",内容如下:
41 41 41 41 41 41
36 36.1 36.2 36.1 36.0 36
脚本保存为test.awk(扩展名可随意),并赋予可执行权限。
终端输入:

代码: 全选

./test.awk shuju.txt
执行完后在你的home下面会有result.txt,内容如下:
41 41 41 41 41 41 0.00%
36 36.1 36.2 36.1 36.0 36 0.23%

如果还提示那个错误应该是awk版本不一样,将第17行那两个**改为^。
果真是awk版本不一样,
貌似没有实现我要的效果哦
我到第一页再改改,更明白一些

Re: 请敎:这样功能怎么样实现

发表于 : 2012-01-30 19:51
josephyoung
如果是想要c组的每个值都从36-44之间取任意整数值的话,从原贴上还真没看出来这个意思,我再想想。
BTW,建议google下"提问的智慧"

Re: 请敎:这样功能怎么样实现

发表于 : 2012-01-30 19:56
autocup
:em03 非常感谢你的建议

Re: 请敎:这样功能怎么样实现

发表于 : 2012-01-30 21:11
josephyoung
从36-44中取出6个数,可放回,是可重复组合的问题。算法貌似还有点麻烦

Re: 请敎:如何写程序来实现这样的功能

发表于 : 2012-01-30 21:49
autocup
是呀,光想就很难了,如果不行,重复的要求那一条就不要了,只要能把所有符合要求的C数组输出就好了

Re: 请敎:如何写程序来实现这样的功能

发表于 : 2012-01-31 0:04
josephyoung
36 36 36 36 36 36 0.00%
36 36 36 36 36 37 1.13%
36 36 36 36 37 37 1.42%
36 36 36 37 37 37 1.50%
36 36 37 37 37 37 1.41%
36 37 37 37 37 37 1.11%
37 37 37 37 37 37 0.00%
36 37 37 37 37 38 1.71%
37 37 37 37 37 38 1.10%
37 37 37 37 38 38 1.38%
37 37 37 38 38 38 1.46%
37 37 38 38 38 38 1.37%
37 38 38 38 38 38 1.08%
38 38 38 38 38 38 0.00%
37 37 38 38 38 39 1.99%
37 38 38 38 38 39 1.66%
38 38 38 38 38 39 1.07%
37 38 38 38 39 39 1.97%
38 38 38 38 39 39 1.35%
38 38 38 39 39 39 1.42%
38 38 39 39 39 39 1.34%
38 39 39 39 39 39 1.05%
39 39 39 39 39 39 0.00%
38 38 39 39 39 40 1.94%
38 39 39 39 39 40 1.62%
39 39 39 39 39 40 1.04%
38 39 39 39 40 40 1.92%
39 39 39 39 40 40 1.31%
39 39 39 40 40 40 1.39%
39 39 40 40 40 40 1.30%
39 40 40 40 40 40 1.02%
40 40 40 40 40 40 0.00%
39 39 40 40 40 41 1.89%
39 40 40 40 40 41 1.58%
40 40 40 40 40 41 1.02%
39 40 40 40 41 41 1.87%
40 40 40 40 41 41 1.28%
40 40 40 41 41 41 1.35%
40 40 41 41 41 41 1.27%
40 41 41 41 41 41 1.00%
41 41 41 41 41 41 0.00%
40 40 41 41 41 42 1.84%
40 41 41 41 41 42 1.54%
41 41 41 41 41 42 0.99%
40 41 41 41 42 42 1.83%
41 41 41 41 42 42 1.25%
40 41 41 42 42 42 1.98%
41 41 41 42 42 42 1.32%
41 41 42 42 42 42 1.24%
40 42 42 42 42 42 1.96%
41 42 42 42 42 42 0.98%
42 42 42 42 42 42 0.00%
41 41 41 41 41 43 1.98%
41 41 41 42 42 43 1.96%
41 41 42 42 42 43 1.80%
41 42 42 42 42 43 1.51%
42 42 42 42 42 43 0.97%
41 42 42 42 43 43 1.79%
42 42 42 42 43 43 1.22%
41 42 42 43 43 43 1.93%
42 42 42 43 43 43 1.29%
41 42 43 43 43 43 1.97%
42 42 43 43 43 43 1.21%
41 43 43 43 43 43 1.91%
42 43 43 43 43 43 0.95%
43 43 43 43 43 43 0.00%
42 42 42 42 42 44 1.93%
42 42 42 42 43 44 1.97%
42 42 42 43 43 44 1.91%
42 42 43 43 43 44 1.76%
42 43 43 43 43 44 1.47%
43 43 43 43 43 44 0.95%
42 43 43 43 44 44 1.74%
43 43 43 43 44 44 1.19%
42 43 43 44 44 44 1.88%
43 43 43 44 44 44 1.26%
42 43 44 44 44 44 1.92%
43 43 44 44 44 44 1.18%
42 44 44 44 44 44 1.87%
43 44 44 44 44 44 0.93%
44 44 44 44 44 44 0.00%
算法有点丑,先不写出来了,结果应该不会错 :em06

Re: 请敎:如何写程序来实现这样的功能

发表于 : 2012-01-31 4:29
autocup
:em11 不错不错,效果很满意呀
期待你发布程序

Re: 请敎:如何写程序来实现这样的功能

发表于 : 2012-01-31 8:24
fnan
a=(36{,,,,,});i=5;while true;do echo ${a[*]};[ ${a[0]} -eq 44 ] && break;((a++,--i<0)) && i=5;done
#创建数组。

Re: 请敎:如何写程序来实现这样的功能

发表于 : 2012-01-31 9:48
josephyoung
最笨的方法,很慢,不好用
[bash]a1=36;a2=36;a3=36;a4=36;a5=36;a6=36
t=0
while true;do
[ "$a1" -le "$a2" ] && [ "$a2" -le "$a3" ] && [ "$a3" -le "$a4" ] &&
[ "$a4" -le "$a5" ] && [ "$a5" -le "$a6" ] && echo $a1 $a2 $a3 $a4 $a5 $a6
let a1+=1
if [ "$a1" -gt 44 ]; then
a1=36
let a2+=1
if [ "$a2" -gt 44 ]; then
a2=36
let a3+=1
if [ "$a3" -gt 44 ]; then
a3=36
let a4+=1
if [ "$a4" -gt 44 ]; then
a4=36
let a5+=1
if [ "$a5" -gt 44 ]; then
a5=36
let a6+=1
[ "$a6" -gt 44 ] && break
fi

fi

fi

fi

fi
[/bash]
[bash]#!/usr/bin/awk -f
BEGIN{
T=6;
C_min=36;
C_max=44;
outfile=ENVIRON["HOME"]"/result.txt";
}
NF==T{
C_sum=0; C_ave=0; C_tmp=0;
for(i=1;i<=T;i++){
# if($i < C_min || $i > C_max)next;
C_sum+=$i;
}
C_ave=C_sum/T;
for(i=1;i<=T;i++)
C_tmp+=($i-C_ave)^2;
s=sqrt(C_tmp/(T-1))/C_ave*100;
if(s<=2){
printf("%s %.2f%%\n",$0,s) >> outfile
}
}
[/bash]

Re: 请敎:如何写程序来实现这样的功能

发表于 : 2012-01-31 11:23
aerofox
这就是基本的实验数据处理的算法,教科书上应该有。
那个求和是可以改一改的,用现在这个公式,必须将所有数据都保存,只5个数据还可以,如果数据量很大,则对存储空间提出了要求。
那个求和公式换成“平方后求和,结果减去平均数的平方”就可以了,这样数据不需要缓存。

Re: 请敎:这样功能怎么样实现

发表于 : 2012-01-31 21:16
xw_y_am
月下叹逍遥 写了:
xw_y_am 写了:额。。。
shell C fortran
都有的说。。。 :em06 :em06

瓜瓜哥哪里学的fortran???
被学的。。。
瓜瓜哥在哪儿被学的?? :em04 :em04