сравнение поля/столбца в 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 содержит строки данных. Вы хотите взять каждую строку в файле 2 и найти значение определенного столбца в файле 1 в качестве ключа. Если это найдено, вы хотите добавить соответствующее значение из 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 что-то делает. Похоже, он просто снова и снова устанавливает переменную, локальную для цикла. У вас включено «строгое использование»? Вы должны получить предупреждение, когда оно достигает $col1[0], потому что в этот момент в области видимости нет переменной с таким именем. Возможно, вместо использования этого цикла вы могли бы сделать что-то вроде

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

А затем обработайте сравнение во втором цикле.

Редактировать: на самом деле, второй список, вероятно, был бы лучше в виде хэша, и тогда это облегчило бы все. Предполагая, что ключи каждой строки в файле2 уникальны, возможно, попробуйте это (непроверено):

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