根据所选列中的非共享值连接两个表

根据所选列中的非共享值连接两个表

我一直在使用 Scriptome(哈佛大学)网站上的“Perl for Biologies with Little Computercoding Knowledge”。它提供了出色的 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

答案1

该脚本非常糟糕,您应该准确指定找到它的位置,以便可以对其进行修复。在这个例子中

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

正在写入名为 的全局未声明哈希%line2。然后它稍后检查该值是否存在于此处,

if ($x) {

您可能想将该块更改为

if (!$x) {
    print $F[$col1];
}

相关内容