我一直在尝试查找大文件的两列(列a和列b)之间匹配的值,并打印公共值以及相应的列d。我一直在通过哈希进行交互来实现这一点,因为文件太大,没有足够的内存来生成输出文件。有没有其他方法可以使用更少的内存资源来做同样的事情。
非常感谢任何帮助。
到目前为止我写的脚本如下:
#!usr/bin/perl
use warnings;
use strict;
open (FILE1, "<input.txt") || die "$!\n Couldn't open input.txt\n";
open (Output, ">output.txt")||die "Can't Open output.txt ";
my $hash1={};
my $hash2={};
while (<FILE1>) {
chomp (my $line=$_);
my ($a, $b, $c, $d) = split (/\t/, $line);
if ($a) {
$hash1->{$a}{info1} = "$d"; #original_ID-> YOB
}
if ($b) {
$hash2->{$b}{info2} = "$a"; #original_ID-> sire
}
foreach my $key (keys %$hash2) {
if (exists $hash1{$a}) {
$info1 = $hash1->{$a}->{info1};
print "$a\t$info1\n";
}
}
}
close FILE1;
close Output;
print "Done\n";
为了澄清,输入文件是一个大的谱系文件。一个例子是:
1 2 3 1977
2 4 5 1944
3 4 5 1950
4 5 6 1930
5 7 6 1928
输出文件的一个示例是:
2 1944
4 1950
5 1928
答案 0 :(得分:0)
以下是否适合您?
#!/usr/local/bin/perl
use strict;
use warnings;
use DBM::Deep;
use List::MoreUtils qw(uniq);
my @seen;
my $db = DBM::Deep->new(
file => "foo.db",
autoflush => 1
);
while (<>) {
chomp;
my @fields = split /\s+/;
$$db{$fields[0]} = $fields[3];
push @seen, $fields[1];
}
for (uniq @seen) {
print $_ . " " . $$db{$_} . "\n" if exists $$db{$_};
}