我有两个文件,并希望从两个文件中找到匹配的字段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;
}
}
}
}
有人可以指出脚本出错的地方吗?
答案 0 :(得分:1)
我认为这将是您的错误所在:
NSZombieEnabled
等于是一项任务 - 所以永远都是如此。你可能想要 if ( $L[0] = ${$_}[0] ) {
if ( $L[1] = ${$_}[1] ) {
。或者==
可能是基于字符串的比较。
更一般地说 - 我认为你应该采取一些措施来收紧你的代码。
eq
和strict
真的很棒。 warnings
很好open
- 这可以避免使用open ( my $input, "<", $filename ) or die $!;
上指定的文件名进行搜索。 (考虑一个名为@ARGV
的文件)'>/etc/passwd'
是否成功。 open
不是特别好。使用${$_}[0]
取消引用可以使代码更好。 我可能会改写为:
->
答案 1 :(得分:0)
至少你有错误 if($ L [0] = $ {$ } [0]){ if($ L [1] = $ {$ } [1]){
您应该使用==或-eq进行比较
请清除您的数据文件格式。我看不到匹配的字段