我需要比较文件中的行:
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个数组(行名称KB0005
和KB204320
)然后按写一个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或其他行)。
我该怎么做?
答案 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:
我有点困惑。我的任务是从此文件中提取仅出现一次(KB0005
或KB204320
)或第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的解决方案正在发挥作用。你能告诉我如何将这个脚本与其他文件结合起来。
我有一个对象列表,就像KB0005
和KB204320
一样,我希望为每一对执行此操作。
答案 1 :(得分:0)
您可以在过滤商品后使用String::Diff。