Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 比较两个VCF文件的字段_Perl - Fatal编程技术网

Perl 比较两个VCF文件的字段

Perl 比较两个VCF文件的字段,perl,Perl,我想请你帮我写一个很简单的脚本 基本上,我想比较两个以制表符分隔的文件的每个字段。 如果文件的第二个字段匹配->比较该行的所有其他字段 如果第一个文件的字段为NA,则为相同位置打印第二个文件的字段 现在我已经写了这个小脚本,但其中一个问题是: 1-如何从第一个文件中保留前9个字段中的第一个字段 2-如何告诉Perl打印第二个文件中带有已更改字段的行 下面是一个我不清楚的例子: 文件1: 1650763778 x GCCC GCCCC 210.38通道AC1=1 GT NA 0/1 文件2: 16

我想请你帮我写一个很简单的脚本

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

如果第一个文件的字段为NA,则为相同位置打印第二个文件的字段

现在我已经写了这个小脚本,但其中一个问题是:

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

2-如何告诉Perl打印第二个文件中带有已更改字段的行

下面是一个我不清楚的例子:

文件1:

1650763778 x GCCC GCCCC 210.38通道AC1=1 GT NA 0/1

文件2:

1650763778 x GCCC GCCCC 210.38通道AC1=1 GT 0/11/10/1

指定制表符分隔的输出:

1650763778 x GCCC GCCCC 210.38通道AC1=1 GT 0/11/10/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";

                }
        }
}

试试这样的。。将\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";
        }
    }
}

谢谢你的回复。非常有帮助,只有一件事:我有两个文件,每个文件有23000行,我发现很难做到的是打印所有行和所做的更改。知道更改的位置确实很有帮助,但是返回并手动输入更改需要花费一些时间。在perl或者awk中是否集成了一些东西来这样做?我曾在网上寻找灵感,但不幸的是没有任何运气。。也许可以创建另一个跟踪更改的数组。因此,在if split1 eq NA语句中,您可以添加push@change,$split_file2[$x];然后稍后遍历该数组,查看哪些行显示了更改的信息。您还可以使用另一个阵列来跟踪哪一行使用了split_file1和split_file2中的数据。希望这有帮助。