sh/bash/dash/ksh/zsh等Shell脚本
-
autocup
- 帖子: 408
- 注册时间: 2010-01-23 20:36
#16
帖子
由 autocup » 2012-01-30 17:10
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下面
ubuntu
-
josephyoung
- 帖子: 158
- 注册时间: 2011-11-05 18:53
- 来自: 南极圈
#17
帖子
由 josephyoung » 2012-01-30 18:02
*是乘号,**是平方。。。
你应该这样运行:
比如你的测量数据保存为"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行那两个**改为^。
-
xw_y_am
- 帖子: 3333
- 注册时间: 2009-05-08 14:18
- 系统: Arch
- 来自: 河南新乡
-
联系:
#18
帖子
由 xw_y_am » 2012-01-30 18:44
额。。。
shell C fortran
都有的说。。。
瓜瓜哥哪里学的fortran???
Linux 相关链接大杂烩
代码: 全选
if(read) {
if(practise) return g☘☘d;
else return w☘☘d;
} else {
return t☘☘d;
}
-
月下叹逍遥
- 论坛版主
- 帖子: 33994
- 注册时间: 2010-10-07 14:23
- 系统: Archdows10
- 来自: 某系某星某洲某国某省某市
-
联系:
#19
帖子
由 月下叹逍遥 » 2012-01-30 18:47
xw_y_am 写了:额。。。
shell C fortran
都有的说。。。
瓜瓜哥哪里学的fortran???
被学的。。。
浮生七十今三十,从此凄惶未可知
-
autocup
- 帖子: 408
- 注册时间: 2010-01-23 20:36
#20
帖子
由 autocup » 2012-01-30 19:22
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版本不一样,
貌似没有实现我要的效果哦
我到第一页再改改,更明白一些
ubuntu
-
josephyoung
- 帖子: 158
- 注册时间: 2011-11-05 18:53
- 来自: 南极圈
#21
帖子
由 josephyoung » 2012-01-30 19:51
如果是想要c组的每个值都从36-44之间取任意整数值的话,从原贴上还真没看出来这个意思,我再想想。
BTW,建议google下"提问的智慧"
-
autocup
- 帖子: 408
- 注册时间: 2010-01-23 20:36
#24
帖子
由 autocup » 2012-01-30 21:49
是呀,光想就很难了,如果不行,重复的要求那一条就不要了,只要能把所有符合要求的C数组输出就好了
ubuntu
-
josephyoung
- 帖子: 158
- 注册时间: 2011-11-05 18:53
- 来自: 南极圈
#25
帖子
由 josephyoung » 2012-01-31 0:04
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%
算法有点丑,先不写出来了,结果应该不会错

-
autocup
- 帖子: 408
- 注册时间: 2010-01-23 20:36
#26
帖子
由 autocup » 2012-01-31 4:29

不错不错,效果很满意呀
期待你发布程序
ubuntu
-
fnan
- 帖子: 919
- 注册时间: 2009-07-01 22:04
#27
帖子
由 fnan » 2012-01-31 8:24
a=(36{,,,,,});i=5;while true;do echo ${a[*]};[ ${a[0]} -eq 44 ] && break;((a++,--i<0)) && i=5;done
#创建数组。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
-
josephyoung
- 帖子: 158
- 注册时间: 2011-11-05 18:53
- 来自: 南极圈
#28
帖子
由 josephyoung » 2012-01-31 9:48
最笨的方法,很慢,不好用
[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]
-
aerofox
- 帖子: 1453
- 注册时间: 2008-05-24 8:30
#29
帖子
由 aerofox » 2012-01-31 11:23
这就是基本的实验数据处理的算法,教科书上应该有。
那个求和是可以改一改的,用现在这个公式,必须将所有数据都保存,只5个数据还可以,如果数据量很大,则对存储空间提出了要求。
那个求和公式换成“平方后求和,结果减去平均数的平方”就可以了,这样数据不需要缓存。
-
xw_y_am
- 帖子: 3333
- 注册时间: 2009-05-08 14:18
- 系统: Arch
- 来自: 河南新乡
-
联系:
#30
帖子
由 xw_y_am » 2012-01-31 21:16
月下叹逍遥 写了:xw_y_am 写了:额。。。
shell C fortran
都有的说。。。
瓜瓜哥哪里学的fortran???
被学的。。。
瓜瓜哥在哪儿被学的??

Linux 相关链接大杂烩
代码: 全选
if(read) {
if(practise) return g☘☘d;
else return w☘☘d;
} else {
return t☘☘d;
}