Perl 基于第二个文件中的键从文件中选择记录

Perl 基于第二个文件中的键从文件中选择记录,perl,matching,Perl,Matching,我的第一个文件看起来像: CHR id position 1 rs58108140 10583

我的第一个文件看起来像:

CHR id position                                                                                                                                                                
1 rs58108140 10583                                                                                                                                                             
1 rs189107123 10611                                                                                                                                                            
1 rs180734498 13302                                                                                                                                                            
1 rs144762171 13327                                                                                                                                                            
1 chr1:13957:D 13957
CHR SNP POS RiskAl OTHER_ALLELE RAF logOR Pval                                                                                                                                 
10 rs1999138 110140096 T C 0.449034245446375 0.0924443 1.09e-06                                                                                                                
6 rs7741604 20839503 C A 0.138318264238111 0.127947 1.1e-06                                                                                                                    
8 rs1486006 82553172 G C 0.833130882716561 0.147456 1.12727730194884e-06  
我的第二个文件看起来像:

CHR id position                                                                                                                                                                
1 rs58108140 10583                                                                                                                                                             
1 rs189107123 10611                                                                                                                                                            
1 rs180734498 13302                                                                                                                                                            
1 rs144762171 13327                                                                                                                                                            
1 chr1:13957:D 13957
CHR SNP POS RiskAl OTHER_ALLELE RAF logOR Pval                                                                                                                                 
10 rs1999138 110140096 T C 0.449034245446375 0.0924443 1.09e-06                                                                                                                
6 rs7741604 20839503 C A 0.138318264238111 0.127947 1.1e-06                                                                                                                    
8 rs1486006 82553172 G C 0.833130882716561 0.147456 1.12727730194884e-06  
我的脚本读入第一个文件并将其存储在一个数组中,然后我想从第一个文件的第2列中找到第二个文件的第2列中的RSID。我想我在如何匹配表达式方面遇到了问题。这是我的剧本:

#! perl -w                                                                                                                                                                      
use strict;
use warnings;

my $F = shift @ARGV;
my @snps;
open IN, "$F";
while (<IN>) {
  next if m/CHR/;
  my @L = split;
  push @snps, [$L[0], $L[1], $L[2]] if $L[0] !~ m/[XY]/;
}
close IN;

open IN, "DIAGRAMv3sansWTCCCqc0clumpd_noTCF7L2regOrLeadOrPlt1em6clumps-     CHR_SNP_POS_RiskAl_OtherAl_RAF_logOR_Pval.txt";
while (<IN>) {
  my @L = split;
  next if m/CHR/;

  foreach (@snps) {
    next if ($L[0] != ${$_}[0]);

    # if not on same chromosome
    if ($L[0] = ${$_}[0]) {

      # if on same chromosome
      if ($L[1] =~ ${$_}[1]) {
        print "$L[0] $L[1] ${$_}[2]\n";
        last;
      }
    }
  }
}
#!perl-w
严格使用;
使用警告;
my$F=shift@ARGV;
我的@snps;
在“$F”中打开;
而(){
下一个是m/CHR/;
我的@L=分裂;
如果$L[0]!~m/[XY]/,则推@snps、[L[0]、[L[1]、[L[2]];
}
接近;
在“DiagramV3sanswtccqc0clumpd\u noTCF7L2regOrLeadOrPlt1em6clumps-CHR\u SNP\u POS\u RiskAl\u other\u RAF\u logOR\u Pval.txt”中打开;
而(){
我的@L=分裂;
下一个是m/CHR/;
foreach(@snps){
下一个if($L[0]!=${$}[0]);
#如果不是在同一条染色体上
如果($L[0]=${$}[0]){
#如果在同一条染色体上
如果($L[1]=~${$}[1]){
打印“$L[0]$L[1]${$\}[2]\n”;
最后;
}
}
}
}

您的代码似乎与您的描述不符。您正在比较文件的第一列和第二列,而不仅仅是第二列

主要问题是:

  • 您可以使用
    $L[0]=${$\u}[0]
    来比较第一列。这将进行辅助而不是比较。您应该使用
    $L[0]=${$\u}[0]
    来代替,或者更好的方法是使用
    $L[0]=$\u>[0]

  • 您可以使用
    $L[1]=~${$}[1]
    来比较第二列。这将检查
    ${$}[1]
    是否是
    $L[1]
    的子字符串。您可以使用像
    $L[1]=~/^${$\u}[1]$/
    这样的锚,但只做字符串比较要好得多,因为
    $L[1]eq$->[1]

最简单的方法是先读取第二个文件,以便构建希望从第一个文件中包含的值的列表。我编写它的目的是让它实现您的代码应该实现的功能,即匹配前两列

看起来像这样

use strict;
use warnings;
use autodie;

my ($f1, $f2) = @_;

my %include;
open my $fh2, '<', $f2;
while (<$fh2>) {
  my @fields = split;
  my $key = join '|', @fields[0,1];
  ++$include{$key};
}
close $fh2;

open my $fh1, '<', $f1;
while (<$fh1>) {
  my @fields = split;
  my $key = join '|', @fields[0,1];
  print "@fields[0,1,2]\n" if $include{$key};
}
close $fh1;
使用严格;
使用警告;
使用自动模具;
我的($f1,$f2)=@;
我的%包括;
打开我的$fh2、[0]和$fields[1]eq$snp->[1];
打印“$fields[0]$fields[1]$snp->[2]\n”;
最后;
}
}
以欧元结算美元;

将数据存储在以第2列为键的散列中。根据显示的示例数据发布所需的输出。