免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3351 | 回复: 15
打印 上一主题 下一主题

如何用Shell处理两个文档中多行数据的加法? zz [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-09 16:24 |只看该作者 |倒序浏览
文档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
复制代码


这个有啥好法子可以实现呢?

论坛徽章:
0
2 [报告]
发表于 2007-06-09 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
复制代码

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
3 [报告]
发表于 2007-06-09 17:18 |只看该作者
貌似最后一域(标号)相同就把前3个域的值分别相加吧?

论坛徽章:
0
4 [报告]
发表于 2007-06-09 20:34 |只看该作者

  1. cat file1 file2 | sort -k 4,4 | awk '
  2.      BEGIN{x=0;y=0;z=0;index=0;myend=0;}
  3.      {
  4.        if($4==index)
  5.        {
  6.          x+=$1;y+=$1;z+=$3;myend=1;
  7.        }
  8.        else
  9.        {
  10.          print x,y,z,index;
  11.          index=$4;
  12.          x=0;y=0;z=0;myend=2;
  13.         }
  14.        }
  15.        END{if(myend==1) print x,y,z,index;}'
  16.          
复制代码

[ 本帖最后由 doctorjxd 于 2007-6-9 20:36 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-06-09 21:54 |只看该作者
这样不行的呀,
另外, 不能用index作变量名吧

原帖由 doctorjxd 于 2007-6-9 20:34 发表
[code]
cat file1 file2 | sort -k 4,4 | awk '
     BEGIN{x=0;y=0;z=0;index=0;myend=0;}
     {
       if($4==index)
       {
         x+=$1;y+=$1;z+=$3;myend=1;
       }
       else
       { ...

论坛徽章:
0
6 [报告]
发表于 2007-06-09 21:55 |只看该作者
原帖由 寂寞烈火 于 2007-6-9 17:18 发表
貌似最后一域(标号)相同就把前3个域的值分别相加吧?


恩, 是想这样

论坛徽章:
0
7 [报告]
发表于 2007-06-09 21:57 |只看该作者
原帖由 预言家 于 2007-6-9 21:55 发表
恩, 是想这样


而且按file2文件中数操作一行就把改变的file1输出到一个新文件中
hongmingjian 该用户已被删除
8 [报告]
发表于 2007-06-09 22:39 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
9 [报告]
发表于 2007-06-10 19:23 |只看该作者
Cool!
这回好看多了

原先为什么加上个touch呢?

你现学的啊? cool...hehe...有什么捷径可否传授一下?
hongmingjian 该用户已被删除
10 [报告]
发表于 2007-06-10 21:06 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP