LinuxSir.cn,穿越时空的Linuxsir!

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

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

[复制链接]
发表于 2007-6-9 17:18:01 | 显示全部楼层 |阅读模式
文档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 17:19:12 | 显示全部楼层
譬如根据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-22 22:31:12 | 显示全部楼层

来段python的,perl不熟悉

来段python的,perl不熟悉,
直接处理数字行,不包括注释行
[PHP]import re

file1=open("1.txt","r")
#读第一个文件中每行数据,并用空格分割每行数据
line1=[re.compile(" +").split(each1) for each1 in file1.readlines()]
file1.close()  

count=0
file2=open("2.txt","r")
for line2 in file2.readlines():
    count+=1
#打开新文件准备写入
    newfile=open("new"+str(count)+".txt","w")
#用空格分割第二个文件当前行
    each2=re.compile(" +").split(line2)
    for each1 in line1:
        if(each1[4]==each2[4]):
#在第一个文件中找到相应的行,并相加输出,用“\t”作为新分割符
           newfile.write("%.4f\t%.4f\t%.4f\t%s"%(float(each1[1])+float(each2[1]),float(each1[2])+float(each2[2]),float(each1[3])+float(each2[3]),each1[4]))
        else:
#不处理,直接输出
            newfile.write("%s\t%s\t%s\t%s"%(each1[1],each1[2],each1[3],each1[4]))
    newfile.close()
file2.close()

[/PHP]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-11 10:23:28 | 显示全部楼层
many 3ks!
回复 支持 反对

使用道具 举报

发表于 2010-4-15 10:31:49 | 显示全部楼层
mark一下
回复 支持 反对

使用道具 举报

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

本版积分规则

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