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列为键的散列中。根据显示的示例数据发布所需的输出。