選択した列の非共有値に基づいて2つのテーブルを結合する

選択した列の非共有値に基づいて2つのテーブルを結合する

私はScriptome(Harvard University)のウェブサイトで「コンピュータコーディングの知識がほとんどない生物学のためのPerl」を使ってきました。これはUnixラインコマンドで実行するために必要な機能を実装する優れたPerlステートメントを提供します。私が使用する非常に便利なスクリプトのタイトルは、「共有値列に基づいて2つのテーブルを結合する(merge_lines_based_on_shared_column)」です。これは非常にうまく機能しますが、時には正反対の効果が必要な場合があります。 IE:指定された値が一致しない2つの列を持つテーブルを作成します。前者の場合、以下に提供されたコードをコピーして貼り付けました。誰でも私を助けることができればとても感謝します。

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

関連情報