Как я могу сравнить строки в файле, используя Perl? - PullRequest
0 голосов
/ 05 августа 2009

Мне нужно сравнить строки в файле:

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";
}

Ouput:

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 ]

1 голос
/ 05 августа 2009

Поскольку вам нужны только те, которые имеют уникальные линии, вы можете изменить начало на следующее:

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, и я хочу выполнить это действие для каждой из них.

0 голосов
/ 05 августа 2009

Вы можете использовать String :: Diff после того, как вы отфильтровали свои элементы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...