Chinaunix

标题: 求一perl脚本(文件处理) [打印本页]

作者: Bisn    时间: 2008-10-17 19:12
标题: 求一perl脚本(文件处理)
文件一:(文件中的分隔符是用空格对齐的)
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

需要将文件二中的最后一列的数字替换成文件一相应的数字
不知道这样的程序该怎么写?
作者: con    时间: 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 编辑 ]
作者: con    时间: 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
作者: dl0622    时间: 2008-10-17 23:04
高人,PF
作者: ynchnluiti    时间: 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 编辑 ]
作者: dl0622    时间: 2008-10-18 09:07
楼上,$line2{$fields1[0]}[$#fields1] = $fields1[-1];
如果我想取$line2{$fields1[0]}的第n个字段是不是这样:$line2{$fields1[0]}[n-1]???
作者: ynchnluiti    时间: 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]???


作者: dl0622    时间: 2008-10-18 12:08
谢谢啦,我正需要这样的东西o(∩_∩)o...




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2