比较两个VCF文件的字段

时间:2014-07-25 16:22:36

标签: perl

我想请求您为我正在尝试的一个看似简单的脚本提供一些帮助。

基本上我想比较两个制表符分隔文件的每个字段。 如果文件的第二个字段匹配 - >比较该行的所有其余字段。

如果第一个文件的字段是" NA"打印相同位置的第二个文件的字段。

现在我写了这个小脚本,但我遇到的问题之一是:

1-如何保留第一个文件中前9个字段的第一个字段

2-如何告诉Perl使用第二个文件中更改的字段打印出该行。

如果我不清楚,这是一个例子:

文件1:

  

16 50763778 x GCCC GCCCC 210.38 PASS AC1 = 1 GT NA NA 0/1

文件2:

  

16 50763778 x GCCC GCCCC 210.38 PASS AC1 = 1 GT 0/1 1/1 0/1

Desidered制表符分隔输出:

  

16 50763778 x GCCC GCCCC 210.38 PASS AC1 = 1 GT 0/1 1/1 0/1

提前感谢您的任何评论和帮助!

use strict;
use warnings;


my $frameshift_file = <>;
my $monomorphic_file = <>;

        my @split_file1 = split "\t", $frameshift_file; #splits the file on tabs 
        my @split_file2 = split "\t",  $monomorphic_file; #splits line on tab delimeted fields

        if ($split_file1[1] eq $split_file2[1] { 

                for (my $i=0; $i<scalar(@split_file1); $i++) {

                if ($split_file1[$i] eq "NA") {

                print $split_file2[$i],"\t";
                } else { print $split_file1[$i],"\t";

                }
        }
}

1 个答案:

答案 0 :(得分:0)

尝试类似这样的事情..(将“\ s +”替换为“\ t”以仅在标签上进行拆分)。

use strict;
use warnings;

my (@split_file1, @split_file2, $frameshift_file, $monomorphic_file, $x);

$frameshift_file = "16 50763778 x GCCC GCCCC 210.38 PASS AC1=1 GT NA NA 0/1";
$monomorphic_file = "16 50763778 x GCCC GCCCC 210.38 PASS AC1=1 GT 0/1 1/1 0/1";

(@split_file1) = split('\s+', $frameshift_file); #splits the file on tabs 
(@split_file2) = split('\s+', $monomorphic_file); #splits line on tab delimeted fields

if ("$split_file1[1]" eq "$split_file2[1]"){   # 2nd field of files match
    for($x = 2; $x <= $#split_file1; $x++){
        if ($split_file1[$x] eq "NA"){    # If file1 shows "NA", print file2 equivalent array element.
            print "split_file1[$x] = \"NA\" .. split_file2[$x] = $split_file2[$x]\n";
        }
    }
}