Re: [問題] 合併三個檔案中的資料
※ 引述《adu (^_^)》之銘言:
: FILE1:
: name1,chrA1
: name2,chrA2
: name3,chrA3
: ...
: FILE2:
: name1,chrB1
: name2,chrB2
: name3,chrB3
: ...
: FILE3:
: name1,chrC1
: name2,chrC2
: name3,chrC3
: ...
: 要將output變成:
: name1,chrA1,chrB1,chrC1
: name2,chrA2,chrB2,chrC2
: name3,chrA3,chrB3,chrC3
: ...
: 每個file都有20萬筆
: 我現在是用while(
: while(
: while(
: )
: )
: )
: 的方式比對,很沒效率而且會out of memory XD
: 並附加error "Use of uninitialized value $Name1 in string"
: 請教板大們有沒有比較好的方法呢?
: 謝謝板大:)
: 附上我的script:
: ##!/usr/bin/perl
: use strict;
: use warnings;
: my $file1 = "A.txt";
: open FILE1, $file1 or die "File open error!!";
: my $fileOUT = ">OUTPUT.txt";
: open FILE0, $fileOUT or die "File open error!!";
: while(<FILE1>){
: chomp($_);
: my $Line1 = $_;
: if($Line1 =~ /(.+?),(.+)/){
: my $Name1 = $1;
: my $CHR1 = $2;
: my $file2 = "B.txt";
: open FILE2, $file2 or die "File open error!!";
: while(<FILE2>){
: chomp($_);
: my $Line2 = $_;
: if($Line2 =~ /(.+?),(.+)/){
: my $Name2 = $1;
: my $CHR2 = $2;
: if($Name1 eq $Name2){
: my $file3 = "C.txt";
: open FILE3, $file3 or die "File open error!!";
: while(<FILE3>){
: chomp($_);
: my $Line3 = $_;
: if($Line3 =~ /(.+?),(.+)/){
: my $Name3 = $1;
: my $CHR3 = $2;
: if($Name1 eq $Name3){
: print FILE0 "$Name3,$CHR1,$CHR2,$CHR3\n";
: }
: }
: }
: }
: }
: }
: }
: }
This might be a quick and dirty way.
#!/usr/bin/env perl
use strict;
use warnings;
# assuming your files are file1.txt, file2.txt and file3.txt.
push @ARGV, qw( file1.txt file2.txt file3.txt );
my %result;
# the diamond will read the files from @ARGV list.
while(<>) {
chomp;
my ($key, $value) = /(.+),(.+)/;
# assuming your name1, name2, ..., and nameX are unique. we can put it
into a hash.
$result{$key} .= ",$value";
}
# now we iterate the hash and generate output.
open my $output, ">OUTPUT" or die "Cannot open OUTPUT file: $!\n";
foreach my $key (sort keys %result) {
print $output "${key}$result{$key}\n";
}
close $output;
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 115.133.239.181
討論串 (同標題文章)
Perl 近期熱門文章
PTT數位生活區 即時熱門文章