perl脚本在两个文件中查找匹配的行

时间:2015-02-04 22:26:15

标签: perl string-matching

我有两个看起来像(下面)的文件,想要找到第二个文件中第一个的字段,但打印第二个文件的每个字段。

#rs116801199 720381
#rs138295790 16057310
#rs131531 16870251
#rs131546 16872281
#rs140375 16873251
#rs131552 16873461

#--- rs116801199 720381 0.026 0.939 0.996 0 -1 -1 -1
#1 rs12565286 721290 0.028 1.000 1.000 2 0.370 0.934 0.000
#1 rs3094315 752566 0.432 1.000 1.000 2 0.678 0.671 0.435
#--- rs3131972 752721 0.353 0.906 0.938 0 -1 -1 -1
#--- rs61770173 753405 0.481 0.921 0.950 0 -1 -1 -1

我的脚本如下:

#! perl -w

my $file1 = shift@ARGV;

my @filtered_snps;
open (IN, $file1) or die "couldn't read file one";
while(<IN>){
    my@L=split;
    #next if ($L[0] =~ m/peak/);
    push @filtered_snps,[$L[0],$L[1]];

}
close IN;

my $file2 = shift@ARGV;

my @snps;
open (IN, $file2);
while (<IN>){
    my@L=split;
    foreach (@filtered_snps){

        if (($L[1] eq ${$_}[0]) && ($L[2] == ${$_}[1])) {

            print "@L\n";

            next;
        }
    }
}

我没有输出,当我应该从文件1中找到每一行时。我也尝试过grep但没有成功。

2 个答案:

答案 0 :(得分:0)

在第一个while您分配错误的数组时,您的意思是@L

然后你的第一个数组(来自第一个文件)和其他数组中的字符串非常不同。尝试在您的迭代中打印出来。你会发现他们无法匹敌。

答案 1 :(得分:0)

从第一个文件创建项目的哈希表,然后遍历第二个文件并检查该名称是否存在...我还确认该数字与名称匹配。

use strict;
use warnings;

my %hash;
my $regex = qr/#.* *(rs\d+) (\d+) *.*/;

open my $file1, '<', shift @ARGV;
while (<$file1>) {
    my ($name, $num) = $_ =~ $regex;
    $hash{$name} = $num;
}
close $file1;

open my $file2, '<', shift @ARGV;
while (<$file2>) {
    my ($name, $num) = $_ =~ $regex;
    print if (exists $hash{$name} and $hash{$name} = $num)
}
close $file2;