如果在文件中匹配,则将Array值与hash和delete键进行比较

时间:2011-11-11 14:52:19

标签: perl

我有{3}的.txt个文件。我想比较第一列和第二列,如果第一列中的值出现在第二列中,我想删除第二列和第三列中的该条目(不应修改第一列)。结果应存储在新文件中。

示例输入:

Col 1                  Col 2              Col 3
VIBHAR_02293_1   VIBHAR_00819_2     tatatattattata
VIBHAR_00819_2   VIBHAR_00819_4     tattavgaggagag
VIBHAR_00705_3   VIBHAR_00705_7     attaggaccaggat
VIBHAR_00819_4   VIBHAR_02153_9     ccagggattattat

示例输出:

VIBHAR_02293_1   VIBHAR_00705_7     attaggaccaggat
VIBHAR_00819_2   VIBHAR_02153_9     ccagggattattat
VIBHAR_00705_3   
VIBHAR_00819_4   

我尝试使用以下代码,但它不起作用:

while($line=(<File>))
{
chomp($line);
@F=split('\t',$line);
    $hash{$F[1]}=$F[2];
    if ($F[0] eq $F[1])
    {
#        print "$line\n";
         delete($hash{keys});
    }
}

如果我上面发布的列的格式不好,那么我猜的只是我的问题。

1 个答案:

答案 0 :(得分:0)

#!/usr/bin/perl
use warnings;
use strict;

my %H;
while (<>) {
    chomp;
    my @F = split /\t/;
    $H{$F[0]} = [$., $F[1], $F[2]];
}

my @col1;
my @col23;

for my $col1 (sort { $H{$a}[0] <=> $H{$b}[0] } keys %H) {
    push @col1, $col1;
    next if exists $H{ $H{$col1}[1] };
    push @col23, [@{ $H{$col1} }[1,2]];
}

for my $i (0 .. $#col1) {
    print $col1[$i];
    print "\t", join "\t", @{ $col23[$i] } if $i < @col23;
    print "\n";
}

你真的想“向上移动”第2列和第3列中的值吗?