선택한 열의 비공유 값을 기반으로 두 테이블 조인

선택한 열의 비공유 값을 기반으로 두 테이블 조인

저는 Scriptome(Harvard University) 웹사이트에서 "컴퓨터 코딩 지식이 거의 없는 생물학을 위한 Perl"을 사용해 왔습니다. 이는 Unix 라인 명령에서 실행하는 데 필요한 기능을 구현하는 뛰어난 Perl 문을 제공합니다. 제가 사용하는 매우 유용한 스크립트의 제목은 "공유 값 열을 기반으로 두 테이블 결합(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];
}

관련 정보