如何使用第二个文件从文件中选择特定行

时间:2013-09-12 19:05:59

标签: perl

我正在尝试使用第二个文件过滤文件(尝试找到最佳爆炸命中)。 我要过滤的文件如下所示:

conserved1      chr22   100.00  92      0       0       1       92      19679676                        19679767        2e-44    182
.....................

我正在使用的第二个文件(我的脚本中的第一个输入)是这样的:

conserved1      92
conserved2      76
.....................

(第一列是我的'item'的名称,它与前一个文件的第一列完全相同,第二列是大小)。

我将第二个文件存储在散列中,以便将第一个文件与保存元素的大小连接起来,并仅过滤大小(第4列)为70%大小的行(来自第2个文件) )。

我为此目的编写了这个脚本,它可以工作但是它不止一次打印每个选定的行。 我该如何解决这个问题?

my $size_file = $ARGV[0];
my $alignment_file = $ARGV[1];

open my $con_info, $size_file or die "Could not open $size_file: $!";

my %hash;
while (<$con_info>)
{
chomp;
my ($key, $val) = split /\t/;
$hash{$key} .= exists $hash{$key} ? "$val" : $val;
}
#print "# %hash\n", Dump \%hash;
#print %hash;
#print "@{[%hash]}";

close $con_info;

open my $al_info, $alignment_file or die "Could not open $alignment_file: $!";

while (my $line = <$al_info>)  {
    chomp;
    my@data = split('\t', $line);
    my $con_name = $data[0];
    my $evalue = $data[10];
    my $percent = $data[2];
    my $length = $data[3];
   # print $con_name. "\n";

foreach my $key (keys %hash) {
    if ($key  == $con_name) {
       #print "key: $key, value: $hash{$key}\n";
            if ($evalue <= 1e-4 && $length >= 0.70 * $hash{$key}) {
                    print $line;
            }

    }
   }
}

输出应该是第一个文件(位于第一个代码框的文件),但是使用较少的行,通过最后一个if条件的行。 非常感谢你的帮助!!!

1 个答案:

答案 0 :(得分:2)

if ($key  == $con_name)

应该是

if ($key eq $con_name)

因为这应该是字符串比较。

你并不需要foreach循环,只需选择一个特定的密钥:

while (my $line = <$al_info>)  {

    chomp($line);
    my @data = split('\t', $line);
    # my $con_name = $data[0];
    # my $percent = $data[2];
    # my $length = $data[3];
    # my $evalue = $data[10];
    my ($con_name, $percent, $length, $evalue) = @data[0,2,3,10];

   # print $con_name. "\n"; 
   if ($evalue <= 1e-4 && $length >= 0.70 * $hash{$con_name}) {
            print $line;
   }
}