如何使用Perl比较文件中的行?

时间:2009-08-05 13:08:59

标签: perl

我需要比较文件中的行:

KB0005  1019    T   IFVATVPVI   0.691   PKC YES
KB0005  1036    T   YFLQTSQQL   0.785   PKC YES
KB0005  1037    S   FLQTSQQLK   0.585   DNAPK   YES
KB0005  1045    S   KQLESEGRS   0.669   PKC YES
KB0005  1045    S   KQLESEGRS   0.880   unsp    YES
KB204320    1019    T   IFVATVPVI   0.699   PKC YES
KB204320    1036    T   YFLQTSQQL   0.789   PKC YES
KB204320    1037    S   FLQTSQQLK   0.589   DNAPK   YES
KB204320    1045    S   KQLESEGRS   0.880   unsp    YES

我需要打印不同或不重复的行,我设法通过先将行放入2个数组(行名称KB0005KB204320)然后按写一个perl脚本:

代码:

foreach $item (@a1, @a2) { $count{$item}++;}

foreach $item (keys %count) {
    if ($count{$item} == 2) {
        next;
    } else {
        push @diff, $item;
    }
}

my @sorted =sort @diff;
#print "\nIntersect Array = @isect\n";
foreach my $el(@sorted){
    print "$el\n";
}

输出继电器:

1019 T IFVATVPVI 0.691 PKC
1019 T IFVATVPVI 0.699 PKC
1036 T YFLQTSQQL 0.785 PKC
1036 T YFLQTSQQL 0.789 PKC
1037 S FLQTSQQLK 0.585 DNAPK
1037 S FLQTSQQLK 0.589 DNAPK
1045 S KQLESEGRS 0.669 PKC  

这很好,我只想打印给定行来自哪一行(KB005或其他行)。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

由于您只想要具有唯一线条的线条,您可以将开头更改为以下内容:

my %hash = ();
my $line = 0;

foreach my $item (@a1, @a2)
{ 
   $line++
   $hash{$item}{count}++;
   $hash{$item}{line} = $line;
}
close FH;

foreach $item (keys %hash) {
    if ($hash{$item} > 1) {
        next;
    } else {
        push @diff, $item;
    }
}

my @sorted = sort @diff;
my $lineNo = 0;

foreach my $el(@sorted){
    $lineNo = $hash{$el}{line};
    print "$el, $lineNo\n";
}

或者非常类似的东西。创建更详细的哈希结构。

此代码未经过测试,但理论应该没问题。

如果内容来自单个文件,我不理解读入2个数组的第一部分。您可以通过在读取文件时构建哈希来克服这个问题:

 open FH, "file.txt";
 while (<FH>)
 { 
    my @items = split (/ /, $_);
    my $item = $items[0];
    $line++
    $hash{$item}{count}++;
    $hash{$item}{line} = $line;
 }
 close FH;

但我可能会误解这一部分。

希望这有帮助

更新1:

我有点困惑。我的任务是从此文件中提取仅出现一次(KB0005KB204320)或第5列中值不同的行。

所以在我想要的输出中,例如:

KB0005 has different value at position 1019 for PKC compared to KB204320 [0.691-0.699]
KB0005 has different value at position 1037 for DNAPK compared to KB204320 [0.585-0.589]
...

  

KB has additional record at position 1045 for PKC

更新2:

FM的解决方案正在发挥作用。你能告诉我如何将这个脚本与其他文件结合起来。

我有一个对象列表,就像KB0005KB204320一样,我希望为每一对执行此操作。

答案 1 :(得分:0)

您可以在过滤商品后使用String::Diff

相关问题