【问题标题】:Compare fields of two VCF files比较两个 VCF 文件的字段
【发布时间】:2014-07-26 03:05:52
【问题描述】:

对于我正在尝试编写的一个看似简单的脚本,我想请你帮忙。

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

如果第一个文件的字段为“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

所需的制表符分隔输出:

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";

                }
        }
}

【问题讨论】:

    标签: perl


    【解决方案1】:

    尝试这样的操作..(将“\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";
            }
        }
    }
    

    【讨论】:

    • 感谢您的回复。真的很有帮助,只有一件事:我有两个文件,每个文件有 23 000 行,我觉得棘手的事情是“打印”所有更改后的行。知道更改的位置确实很有帮助,但是然后返回并手动进行更改有点费时。也许 awk 的 perl 中集成了一些东西来做到这一点?我在网上寻找“灵感”,但不幸的是没有任何运气。
    • 我的头顶..也许创建另一个跟踪“变化”的数组。因此,在 "if (split1 eq "NA")" 语句中,您可以添加 push(@change, "$split_file2[$x]");然后稍后遍历该数组以查看哪些行显示了更改的信息。您还可以有另一个数组来跟踪哪一行使用了 split_file1 和 split_file2 中的数据。希望这会有所帮助。
    猜你喜欢
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 2012-06-15
    • 2016-10-23
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多