perl脚本用于查找两个文件中匹配的字段

时间:2015-07-02 14:48:21

标签: regex perl

我有两个文件,并希望从两个文件中找到匹配的字段1和2,并在字段1和2匹配时从第二个文件中打印第三个字段。文件1看起来像:

#CHR BP                                                                                                          
#1 9690639                                                                                                      
#1 7338706                                                                                                      
#1 7338707                                                                                                      
#1 7338717

文件2看起来像:

#1 10036 rs11928874 CT C 315.21 VQSRTrancheINDEL99.99to100.00AC=3;AF=0.063;AN=48;BaseQRankSum=0.297;DP=1469;FS=16.265;InbreedingCoeff=-0.0941;MLEAC=3;MLEAF=0.063;MQ=14.67;MQ0=0;MQRankSum=1.339

我编写了以下perl脚本,它输出了太多不符合匹配条件的行:

my @loci;
open IN, "highalt_results.txt";
while (<IN>) {
    my @L = split;
    next if m/CHR/;
    push @loci, [ $L[0], $L[1] ];
}
close IN;

my $F = shift @ARGV;
open IN, "$F";
while (<IN>) {
    my @L = split;
    next if m/#CHROM/;
    foreach (@loci) {
        if ( $L[0] = ${$_}[0] ) {
            if ( $L[1] = ${$_}[1] ) {
                print "${$_}[0] ${$_}[1] $L[2]\n";
                next;
            }
        }
    }
}

有人可以指出脚本出错的地方吗?

2 个答案:

答案 0 :(得分:1)

我认为这将是您的错误所在:

NSZombieEnabled

等于是一项任务 - 所以永远都是如此。你可能想要 if ( $L[0] = ${$_}[0] ) { if ( $L[1] = ${$_}[1] ) { 。或者==可能是基于字符串的比较。

更一般地说 - 我认为你应该采取一些措施来收紧你的代码。

  • eqstrict真的很棒。
  • 带有词法文件句柄的
  • 3参数warnings很好open - 这可以避免使用open ( my $input, "<", $filename ) or die $!;上指定的文件名进行搜索。 (考虑一个名为@ARGV的文件)
  • 你真的应该检查'>/etc/passwd'是否成功。
  • 我可能建议在你的foreach循环中使用implict变量 not ,因为open不是特别好。使用${$_}[0]取消引用可以使代码更好。

我可能会改写为:

->

答案 1 :(得分:0)

至少你有错误            if($ L [0] = $ {$ } [0]){                 if($ L [1] = $ {$ } [1]){

您应该使用==或-eq进行比较

请清除您的数据文件格式。我看不到匹配的字段