сравнение на поле/колона в Perl

Бих искал да сравня стойностите от колона (col1) в един файл (file1) с всички записи от колона (col1) в друг файл (file2). Стратегията ми беше да чета файлове за всеки ред във файла, разделен с разделител и да сравня стойностите в две колони. Ако има съвпадение, отпечатайте определената стойност от колоната във втория файл и я добавете към последната колона на първия файл, в противен случай отпечатайте „не е намерено“ и я добавете към последната колона на първия файл. Мисля, че следващият ми скрипт сравнява ред с ред вместо ред с всички редове в полето и връща грешки (Използване на неинициализирана стойност $col1[0]...). Любезната ви помощ ще бъде оценена.

open (FILE1, "<", "file1") or die ("Can't open file $!");
open (FILE2, "<", "file2") or die  ("Can't open file $!");
my @data1 = <FILE1>;
my @data2 = <FILE2>;
foreach my $curr_line_1 ( @data1 ) {
    my @col1 = split "\t", $curr_line_1;
    }
foreach my $curr_line_2 ( @data2 ) {
    my @col2 = split "\t", $curr_line_2;
    }
            if ("$col1[0]" eq "$col2[0]") {
                open FINAL, '>>', 'final';
                push(@col1, "$col2[1]");
                print FINAL "@col1\n";
                }
            else {
                open FINAL, '>>', 'final';
                push(@col1, "not found");
                print FINAL "@col1\n";
                }
close(FINAL);
close(FILE1);
close(FILE2);

file1    
1  mary
1  tom
2  john
3  will
4  hugh
5  eddy

file2
2  unit2
3  unitA
5  base

final
1  mary  not found
1  tom   not found
2  john  unit2
3  will  unitA
4  hugh  not found
5  eddy  base

person jamie    schedule 30.07.2013    source източник
comment
Въпросът ви е малко неясен. File1 съдържа таблица за търсене на ключове и стойности. File2 съдържа редове с данни. Искате да вземете всеки ред във File2 и да потърсите стойността на определена колона във File1 като ключ. Ако бъде намерено, искате да добавите съответната стойност от File1 към различна колона във File2; ако не е намерен, искате да добавите низа Not Found към същата колона във File2. Дали това е правилно? Би било много полезно, ако можете да предоставите някои примерни данни за File1 и File2 и очаквания резултат.   -  person Jim Garrison    schedule 30.07.2013
comment
Вие сте абсолютно прав. Веднага ще предоставя примерни данни!   -  person jamie    schedule 30.07.2013
comment
грешка на новобранец! Оправих го.   -  person jamie    schedule 30.07.2013
comment
Сега вече никога не може да бъде невярно.   -  person dms    schedule 30.07.2013
comment
Надявам се, че това има смисъл сега :)   -  person jamie    schedule 30.07.2013


Отговори (1)


Не мисля, че вашият първи for цикъл прави нещо. Изглежда, че просто задава променлива, която е локална за цикъла, отново и отново. Имате ли включено „use strict“? Трябва да получавате предупреждение, когато удари $col1[0], защото в този момент няма променлива с това име в обхвата. Може би вместо да използвате този цикъл, можете да направите нещо подобно

my @data1_fields = map { [ split "\t", $_ ] } @data1;

И след това обработете сравнението във втория цикъл.

Редактиране: всъщност вторият списък вероятно би бил по-добър като хеш и тогава това ще направи всичко по-лесно. Ако приемем, че ключовете на всеки ред във file2 са уникални, може би опитайте това (непроверено):

my %data2_hash = ();
for (@data2) {
  $data2_hash{$_[0]} = $_[1];
}
for (@data1_fields) {
  # this is bad style, but w/e
  push(@{$_}, $data2_hash{$_[0]}) if exists $data2_hash{$_[0]};
}
open FINAL, '>>', 'final';
for (@data1_fields) {
  print FINAL join "\t", @{$_};
}
person Jeremy    schedule 30.07.2013