免费注册 查看新帖 |

Chinaunix

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

求一perl脚本(文件处理) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-17 19:12 |只看该作者 |倒序浏览
10可用积分
文件一:(文件中的分隔符是用空格对齐的)
CG        -21.5990   16.9540   20.9670 C.ar    455 HIS492      0.1868
ND1       -20.4100   17.3320   21.5890 N.ar    455 HIS492     -0.5432
CD2       -21.2270   16.5140   19.7420 C.ar    455 HIS492     -0.2207
CE1       -19.4030   17.1370   20.7830 C.ar    455 HIS492      0.1635
NE2       -19.8730   16.6350   19.6350 N.ar    455 HIS492     -0.2795
FE          5.8900   24.5680   -1.0580 Fe      456 HEM500      2.0000
CHA         7.6710   24.9950   -3.8030 C.2     456 HEM500      0.0000
CHB         3.0650   24.0730   -3.0020 C.2     456 HEM500      0.0000
CHC         3.9520   24.6230    1.7030 C.2     456 HEM500      0.0000
CHD         8.5300   25.2220    0.8460 C.2     456 HEM500      0.0000



  
文件二:(文件中的分隔符是用空格对齐的)
FE          5.8900   24.5680   -1.0580 Fe        1 HEM500      2.0000
CHA         7.6710   24.9950   -3.8030 C.2       1 HEM500     -0.0100
CHB         3.0650   24.0730   -3.0020 C.2       1 HEM500     -0.0100
CHC         3.9520   24.6230    1.7030 C.2       1 HEM500     -0.0097
CHD         8.5300   25.2220    0.8460 C.2       1 HEM500     -0.0097

需要将文件二中的最后一列的数字替换成文件一相应的数字
不知道这样的程序该怎么写?

最佳答案

查看完整内容

假设文件1叫t1, 文件2叫t221行修改一下[ 本帖最后由 con 于 2008-10-18 00:09 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-10-17 19:12 |只看该作者
假设文件1叫t1, 文件2叫t2

21行修改一下

#!/usr/bin/perl

use strict;

my $fh;
my %i;

open ( $fh, '<', "t1" ) or die $!;

while ( <$fh> ) {
&nbsp;&nbsp;&nbsp;&nbsp;chomp;
&nbsp;&nbsp;&nbsp;&nbsp;split /\s+/;
&nbsp;&nbsp;&nbsp;&nbsp;$i{$_[0]} = $_[-1];
}
close $fh;

open ( $fh, '<', "t2" ) or die $!;

while ( <$fh> ) {
&nbsp;&nbsp;&nbsp;&nbsp;chomp;
&nbsp;&nbsp;&nbsp;&nbsp;split /\s+/;
&nbsp;&nbsp;&nbsp;&nbsp;$_[-1] = $i{$_[0]} if defined ($i{$_[0]});
&nbsp;&nbsp;&nbsp;&nbsp;print  join ("\t", @_) , "\n";
}
close $fh;


[ 本帖最后由 con 于 2008-10-18 00:09 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-10-17 20:49 |只看该作者
输出结果:

FE      5.8900  24.5680 -1.0580 Fe      1       HEM500  2.0000
CHA     7.6710  24.9950 -3.8030 C.2     1       HEM500  0.0000
CHB     3.0650  24.0730 -3.0020 C.2     1       HEM500  0.0000
CHC     3.9520  24.6230 1.7030  C.2     1       HEM500  0.0000
CHD     8.5300  25.2220 0.8460  C.2     1       HEM500  0.0000

论坛徽章:
0
4 [报告]
发表于 2008-10-17 23:04 |只看该作者
高人,PF

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
5 [报告]
发表于 2008-10-17 23:41 |只看该作者
  1. #!/usr/bin/perl -w
  2. #
  3. use strict;
  4. use warnings;

  5. my $fh;
  6. my %order2;
  7. my %line2;

  8. open $fh, "t2" or die "t2:$!";

  9. while (<$fh>) {
  10.     chomp;
  11.     my @fields2 = split /\s+/;

  12.     $line2{$fields2[0]} = [ @fields2 ];
  13.     $order2{$.} = $fields2[0];
  14. }
  15. close($fh);

  16. open $fh, "t1" or die "t1:$!";

  17. while (<$fh>) {
  18.     chomp;
  19.     my @fields1= split /\s+/;

  20.     unless (not defined $line2{$fields1[0]}) {
  21.         $line2{$fields1[0]}[$#fields1] = $fields1[-1];
  22.     }   
  23. }

  24. for (sort keys %order2) {
  25.     print sprintf("%-11s %6s %9s %9s %-5s %5s %-10s %7s\n", @{$line2{$order2{$_}}});
  26. }

  27. close($fh);
复制代码

[ 本帖最后由 ynchnluiti 于 2008-10-17 23:44 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2008-10-18 09:07 |只看该作者
楼上,$line2{$fields1[0]}[$#fields1] = $fields1[-1];
如果我想取$line2{$fields1[0]}的第n个字段是不是这样:$line2{$fields1[0]}[n-1]???

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
7 [报告]
发表于 2008-10-18 11:19 |只看该作者
原帖由 dl0622 于 2008-10-18 09:07 发表
楼上,$line2{$fields1[0]}[$#fields1] = $fields1[-1];
如果我想取$line2{$fields1[0]}的第n个字段是不是这样:$line2{$fields1[0]}[n-1]???

论坛徽章:
0
8 [报告]
发表于 2008-10-18 12:08 |只看该作者
谢谢啦,我正需要这样的东西o(∩_∩)o...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP