LinuxSir.cn,穿越时空的Linuxsir!

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

如何用Shell处理两个文档中多行数据的加法?

[复制链接]
发表于 2007-6-9 16:06:44 | 显示全部楼层 |阅读模式
文档1格式是这个样子的:

  1. [...]
  2. #下面是需要处理的数据,前三列是三维坐标,最后一列是“标号”
  3.   0.9986  0.9231  0.8750    1
  4.   0.4986  0.9231  0.8750    2
  5.   0.9986  0.4231  0.8750    3
  6.   0.4986  0.4231  0.8750    4
  7.   0.9986  0.9231  0.3750    5
  8.   0.4986  0.9231  0.3750    6
  9.   0.9986  0.4231  0.3750    7
  10.   0.4986  0.4231  0.3750    8
  11.   0.5013  0.5768  0.6250    9
  12.   0.0013  0.5768  0.6250   10
  13. #end of file1
复制代码


文档2的格式是这样的:

  1. #number of files will be created
  2.     7
  3. #下面每一行中前三个数据(即三维坐标)需要分别加到文档1中同“标号”所在行的三维坐标中后将文档1生成一个新的文档
  4. #上一行中的7,标示下面总共有7行,即需要产生7个新的文档
  5. 0.1000   0.0000  0.0000  2
  6. 0.0000   0.0000 -0.1100  2
  7. 0.2000   0.0000  0.0000  5
  8. 0.0000  -0.1200  0.0000  5
  9. 0.5000   0.0000  0.0000  8
  10. 0.0000   0.5000  0.5000  8
  11. 0.9000   0.0000  0.0000  10
  12. #end of file2
复制代码


这个有啥好法子可以实现呢?
 楼主| 发表于 2007-6-9 16:16:26 | 显示全部楼层
譬如根据file2中的下面这一行:

  1. 0.1000   0.0000  0.0000  2
复制代码

表示应该对file1中的标号为2的这一行

  1.   0.4986  0.9231  0.8750    2
复制代码

进行加法,
从而产生下面一个新的文档

  1. [...]
  2. #下面是需要处理的数据,前三列是三维坐标,最后一列是“标号”
  3.   0.9986  0.9231  0.8750    1
  4.   0.5986  0.9231  0.8750    2
  5.   0.9986  0.4231  0.8750    3
  6.   0.4986  0.4231  0.8750    4
  7.   0.9986  0.9231  0.3750    5
  8.   0.4986  0.9231  0.3750    6
  9.   0.9986  0.4231  0.3750    7
  10.   0.4986  0.4231  0.3750    8
  11.   0.5013  0.5768  0.6250    9
  12.   0.0013  0.5768  0.6250   10
  13. #end of file1
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-6-9 22:40:27 | 显示全部楼层

  1. #!/usr/bin/mawk -f
  2. BEGIN{
  3.     total=1;
  4.     while(getline temp<"file2"){
  5.         if (match(temp,"^ *#")) continue;
  6.         tNF=split(temp,t);
  7.                 if(tNF!=4)continue;
  8.         for(i=1;i<total;i++) if (data[i,4]==t[4]) {
  9.             for(j=1;j<4;j++) data[i,j]+=t[j];
  10.             break;}
  11.         if(i==total){for(j=1;j<=4;j++) data[i,j]=t[j];
  12.             total++;}
  13.     }
  14. }
  15. {for(i=1;i<total;i++) if (data[i,4] && $4 == data[i,4]){$1+=data[i,1];$2+=data[i,2];$3+=data[i,3];delete data[i,4]}
  16. print
  17. }
复制代码

运行awk -f file1. 输出的格式会乱, 但应该影响不在
回复 支持 反对

使用道具 举报

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

本版积分规则

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