Объединение двух таблиц на основе несовпадающих значений в выбранном столбце

Я использовал "Perl для биологов с небольшими знаниями компьютерного кодирования" с сайта под названием Scriptome (Гарвард). Там даны отличные однострочные скрипты Perl для достижения желаемых функций, которые выполняются с помощью командной строки Unix. Один очень полезный скрипт, который я использую, называется: "Объединить две таблицы на основе столбцов с общим значением (merge_lines_based_on_shared_column)". Это работает отлично, но иногда мне нужно прямо противоположное. IE: создание таблиц, в которых заданные значения из двух столбцов не совпадают. Для первого случая я копирую/вставляю код, который приведен ниже. Я буду очень благодарен, если кто-нибудь сможет мне помочь.

myScirpt.pl

$col1=1;
$col2=0;
($f1,$f2)=@ARGV;
open(F2,$f2);
while (<F2>) {
    s/\r?\n//;
    @F=split /\t/, $_;
    $line2{$F[$col2]} .= "$_\n"
};
$count2 = $.;
open(F1,$f1);
while (<F1>) {
    s/\r?\n//;
    @F=split /\t/, $_;
    $x = $line2{$F[$col1]};
    if ($x) {
        $num_changes = ($x =~ s/^/$_\t/gm);
        print $x;
        $merged += $num_changes
    }
} warn "\nJoining $f1 column $col1 with $f2 column $col2\n"
    . "$f1: $. lines\n"
    . "$f2: $count2 lines\n"
    . "Merged file: $merged lines\n";

Затем я запускаю его как,

myScript.pl Input-file1.txt Input-file2.txt > Merge-file.txt
0
12.02.2019, 18:29
1 ответ

Этот сценарий довольно плохой, вы должны точно указать, где вы его нашли, чтобы его можно было исправить. В этом примере

$x = $line2{$F[$col1]};

Выполняется запись в глобальный необъявленный хэш с именем %line2. Затем он позже проверяет, присутствует ли это значение здесь,

if ($x) {

Вероятно, вы захотите изменить этот блок на

if (!$x) {
    print $F[$col1];
}
-1
28.01.2020, 05:05

Теги

Похожие вопросы