LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1358|回复: 8

如何对多个文件的对应行进行加和再求平均值?

[复制链接]
发表于 2006-3-18 21:33:48 | 显示全部楼层 |阅读模式
因需要处理许多文件中的数据,只好来请教各位帮忙了。

比如: 有100个文件,这里仅列出三个

1.tmp的内容
  1.     1.313  
  2.    -0.037  
  3.    -0.576  
  4.    -0.830  
  5.    -0.493  
  6.    -0.202  
  7.     0.125  
  8.    -3.188  
  9.    -0.124  
  10.    -0.341  
  11.     0.321  
  12.    -0.063  
  13.    -0.081  
  14.     0.047  
  15.     0.820  
  16.    -1.020  
  17.   -13.335  
复制代码

2.tmp
  1.     1.016  
  2.    -0.026  
  3.    -0.269  
  4.    -0.746  
  5.    -0.572  
  6.    -0.191  
  7.     0.268  
  8.    -2.708  
  9.    -0.102  
  10.    -0.123  
  11.     0.404  
  12.    -0.017  
  13.    -0.155  
  14.     0.069  
  15.     0.436  
  16.    -1.049  
  17.    -9.548  
复制代码

3.tmp
  1.     0.713  
  2.    -0.037  
  3.     0.005  
  4.    -0.576  
  5.    -0.345  
  6.    -0.250  
  7.     0.170  
  8.    -2.032  
  9.    -0.190  
  10.    -0.146  
  11.     0.614  
  12.    -0.024  
  13.    -0.130  
  14.     0.090  
  15.     0.455  
  16.    -0.902  
  17.    -8.108  
复制代码


三个文件格式都是一样的,是我从其它结果中单独取出来的,我把它们保存为多个*.tmp文件。现在的问题是:
   如何对三个文件中相对于行的数值进行求和,然后再把总和求平均。也就是说,希望得到的新文件中第一行的数据=(1.313+1.016+0.713 )/3; 第二行的数据={(-0.037) +(-0.026)+(-0.037)}/3;其它行的数据依此类推。  

我看了awk的介绍,没有找到如何对不同文件的数据进行操作,希望高手们给指点一二
先谢谢了。
发表于 2006-3-18 21:44:41 | 显示全部楼层
paste 1 2 3 | awk '{ print ($1 + $2 + $3) / 3 }'
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-18 22:29:35 | 显示全部楼层
Post by seamonkey
paste 1 2 3 | awk '{ print ($1 + $2 + $3) / 3 }'


:thank  seamonkey , 我运行了一下没有问题。 但我给出的仅是三个文件的例子,我有100多个文件需要这样做,如果paste后面跟一大串的文件名恐怕有些繁琐,是否可以设置变量,让程序自动读完所有的文件后,运行计算呢?
回复 支持 反对

使用道具 举报

发表于 2006-3-18 22:52:06 | 显示全部楼层
如果文件在一个目录中,没有其它文件,那么

paste * | awk '{ total=0; for (i=1; i<=NF; i++) total += $i; print total/NF; }'

文件名有规律也好办。

睡觉了,明天见
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-18 23:51:26 | 显示全部楼层
Post by seamonkey
如果文件在一个目录中,没有其它文件,那么

paste * | awk '{ total=0; for (i=1; i<=NF; i++) total += $i; print total/NF; }'

文件名有规律也好办。

睡觉了,明天见


我把你写的语句改了一点点
paste *.tmp | awk '{ total=0; for (i=1; i<=NF; i++) total += $i; print total/NF; }'
程序能得到正确的计算结果,但是也给出一个错误的语句提示:
awk: cmd. line:1: (FILENAME=- FNR=85) fatal: division by zero attempted

不知道原因为啥?:p
回复 支持 反对

使用道具 举报

发表于 2006-3-19 00:04:22 | 显示全部楼层
Post by irene
我把你写的语句改了一点点
paste *.tmp | awk '{ total=0; for (i=1; i<=NF; i++) total += $i; print total/NF; }'
程序能得到正确的计算结果,但是也给出一个错误的语句提示:
awk: cmd. line:1: (FILENAME=- FNR=85) fatal: division by zero attempted

不知道原因为啥?:p

fatal: division by zero attempted


如你的报错信息所说,试图除0
回复 支持 反对

使用道具 举报

发表于 2006-3-19 01:01:00 | 显示全部楼层
hmm... that's interesting. he said he got the correct result but if awk processed NF wrong, how come he still got the value?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-19 15:27:12 | 显示全部楼层
awk: cmd. line:1: (FILENAME=- FNR=85) fatal: division by zero attempted


我检查了一下生成的tmp文件,发现每个tmp文件中,数据有84行,最后一行都是空格行,FNR=85 ,这里85就是空格行数,可能是这个空格行引起的错误。
回复 支持 反对

使用道具 举报

发表于 2006-3-19 16:13:23 | 显示全部楼层
怎么不是返回一个nan (Not a Number)  值来?
回复 支持 反对

使用道具 举报

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

本版积分规则

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