用于检查间隔的perl代码

用于检查间隔的perl代码,perl,Perl,输入文件1:包含下限和上限 1: 3 5 2: 4 7 3: 8 10 4: 5 10 5: 10 15 6: 10 20 7: 15 30 8: 30 40 输入文件2:它包含某些值 a 3 b 4 c 6 d 7 文件3:它还包含一些值 a 9 b 12 c 36 d 23

输入文件1:包含下限和上限

1:     3     5  
2:    4     7  
3:     8     10  
4:    5     10  
5:    10    15  
6:    10    20  
7:     15    30  
8:    30    40  
输入文件2:它包含某些值

a    3  
b    4  
c    6  
d    7  
文件3:它还包含一些值

a    9  
b    12  
c    36  
d    23  
输出:

1    a b      file2  
2    b c d    file2  
3      
4    c d      file2  
5    b        file3  
6    b        file3  
7    d        file3    
8    c d      file3    
我有三个文件。file1包含范围,file2或file3包含某些值。现在我们必须检查文件1中的间隔id,并打印命中的输出,即。, 如果值属于任何间隔,则必须打印间隔id、值id及其来源的文件

#!/bin/usr/perl -w  
use strict ;  
open (R1,"$file1.txt")|| die;  
open (R2,"$file2.txt")|| die;  
open (R3,"$file3.txt")|| die;   

 while (($lin1=<R1>) && ($line=<R2>) && ($line3= <R3>)){
  my $i;
#/bin/usr/perl-w
严格使用;
打开(R1,“$file1.txt”)| |模具;
打开(R2,“$file2.txt”)| |模具;
打开(R3,“$file3.txt”)| |模具;
而($lin1=)&&($line=)&&($line3=)){
我的$i;

这里卡住了..如何检查文件2和文件3的某个特定值是否属于文件1中的哪个值,以及文件1中的间隔时间

您可以尝试以下perl脚本:

#! /usr/bin/perl

use v5.12;
use autodie;

my @files=qw(file2 file3);

my %val;

for my $file (@files) {
    open (my $fh, "<", $file);
    while (my $line=<$fh>) {
        my ($id, $val)=$line=~/(\S+)\s+(\d+)/;
        $val{$file}=[] if (! exists $val{$file});
        push (@{$val{$file}},{id=>$id, val=>$val});
    }
    close($fh);
}
my @iv;
open (my $fh, "<", "file1");
while (my $line=<$fh>) {
    my ($id,$start,$end)=$line=~/(\d+):\s+(\d+)\s+(\d+)/;
    my %h=();
    for my $file (@files) {
        my $str="";
        for my $vv (@{$val{$file}}) {
            my $v=$vv->{val};
            if ($v>=$start && $v<=$end) {
                $str=$str." ".$vv->{id};
            }
        }
        $h{$file}=$str if $str;
    }
    $h{id}=$id;
    push (@iv,\%h);
}
close($fh);

for (@iv) {
    my $int=$_;
    print $int->{id};
    for my $file (@files) {
        if (exists $int->{$file}) {
            print "\t",$int->{$file},"\t",$file;
        }
    }
    print "\n";
}

您可以尝试以下perl脚本:

#! /usr/bin/perl

use v5.12;
use autodie;

my @files=qw(file2 file3);

my %val;

for my $file (@files) {
    open (my $fh, "<", $file);
    while (my $line=<$fh>) {
        my ($id, $val)=$line=~/(\S+)\s+(\d+)/;
        $val{$file}=[] if (! exists $val{$file});
        push (@{$val{$file}},{id=>$id, val=>$val});
    }
    close($fh);
}
my @iv;
open (my $fh, "<", "file1");
while (my $line=<$fh>) {
    my ($id,$start,$end)=$line=~/(\d+):\s+(\d+)\s+(\d+)/;
    my %h=();
    for my $file (@files) {
        my $str="";
        for my $vv (@{$val{$file}}) {
            my $v=$vv->{val};
            if ($v>=$start && $v<=$end) {
                $str=$str." ".$vv->{id};
            }
        }
        $h{$file}=$str if $str;
    }
    $h{id}=$id;
    push (@iv,\%h);
}
close($fh);

for (@iv) {
    my $int=$_;
    print $int->{id};
    for my $file (@files) {
        if (exists $int->{$file}) {
            print "\t",$int->{$file},"\t",$file;
        }
    }
    print "\n";
}

您可以尝试以下perl脚本:

#! /usr/bin/perl

use v5.12;
use autodie;

my @files=qw(file2 file3);

my %val;

for my $file (@files) {
    open (my $fh, "<", $file);
    while (my $line=<$fh>) {
        my ($id, $val)=$line=~/(\S+)\s+(\d+)/;
        $val{$file}=[] if (! exists $val{$file});
        push (@{$val{$file}},{id=>$id, val=>$val});
    }
    close($fh);
}
my @iv;
open (my $fh, "<", "file1");
while (my $line=<$fh>) {
    my ($id,$start,$end)=$line=~/(\d+):\s+(\d+)\s+(\d+)/;
    my %h=();
    for my $file (@files) {
        my $str="";
        for my $vv (@{$val{$file}}) {
            my $v=$vv->{val};
            if ($v>=$start && $v<=$end) {
                $str=$str." ".$vv->{id};
            }
        }
        $h{$file}=$str if $str;
    }
    $h{id}=$id;
    push (@iv,\%h);
}
close($fh);

for (@iv) {
    my $int=$_;
    print $int->{id};
    for my $file (@files) {
        if (exists $int->{$file}) {
            print "\t",$int->{$file},"\t",$file;
        }
    }
    print "\n";
}

您可以尝试以下perl脚本:

#! /usr/bin/perl

use v5.12;
use autodie;

my @files=qw(file2 file3);

my %val;

for my $file (@files) {
    open (my $fh, "<", $file);
    while (my $line=<$fh>) {
        my ($id, $val)=$line=~/(\S+)\s+(\d+)/;
        $val{$file}=[] if (! exists $val{$file});
        push (@{$val{$file}},{id=>$id, val=>$val});
    }
    close($fh);
}
my @iv;
open (my $fh, "<", "file1");
while (my $line=<$fh>) {
    my ($id,$start,$end)=$line=~/(\d+):\s+(\d+)\s+(\d+)/;
    my %h=();
    for my $file (@files) {
        my $str="";
        for my $vv (@{$val{$file}}) {
            my $v=$vv->{val};
            if ($v>=$start && $v<=$end) {
                $str=$str." ".$vv->{id};
            }
        }
        $h{$file}=$str if $str;
    }
    $h{id}=$id;
    push (@iv,\%h);
}
close($fh);

for (@iv) {
    my $int=$_;
    print $int->{id};
    for my $file (@files) {
        if (exists $int->{$file}) {
            print "\t",$int->{$file},"\t",$file;
        }
    }
    print "\n";
}
只是另一种方法

#!/usr/bin/perl
use strict;
use warnings;

open my $fh2, '<', 'file2' or die $!;
my %hash2 = map split, <$fh2>;
close $fh2 or die $!;

open my $fh3, '<', 'file3' or die $!;
my %hash3 = map split, <$fh3>;
close $fh3 or die $!;

open my $fh1, '<', 'file1' or die $!;
while (<$fh1>) {
    my ($id, $min, $max) = split;

    my @letters2 = grep $hash2{$_} >= $min && $hash2{$_} <= $max, 
        sort keys %hash2;
    my @letters3 = grep $hash3{$_} >= $min && $hash3{$_} <= $max, 
        sort keys %hash3;

    print join(" ", $id, @letters2,
                    @letters2 ? 'file2' : (),
                    @letters3,
                    @letters3 ? 'file3' : ()
               ), "\n";
}
close $fh1 or die $!;
更新:一种更好的方法,允许2个以上的文件

#!/usr/bin/perl
use strict;
use warnings;

my %name_num;
my @file = qw/file2 file3/;

for my $file (@file) {
    open my $fh, '<', $file or die $!;
    %{ $name_num{$file} } = map split, <$fh>;
}

open my $fh1, '<', 'file1' or die $!;
while (<$fh1>) {
    my ($id, $min, $max) = split;
    print $id;

    for my $file (@file) {
        my @letters =
            grep $name_num{$file}{$_} >= $min && $name_num{$file}{$_} <= $max, 
                sort keys %{$name_num{$file}};

        if (@letters) {
            print join(" ", '', @letters, $file);
        }
    }
    print "\n"; 
}
close $fh1 or die $!;
!/usr/bin/perl
严格使用;
使用警告;
我的%name\u num;
my@file=qw/file2 file3/;
对于我的$file(@file){
打开我的$fh,“只是另一种方法

#!/usr/bin/perl
use strict;
use warnings;

open my $fh2, '<', 'file2' or die $!;
my %hash2 = map split, <$fh2>;
close $fh2 or die $!;

open my $fh3, '<', 'file3' or die $!;
my %hash3 = map split, <$fh3>;
close $fh3 or die $!;

open my $fh1, '<', 'file1' or die $!;
while (<$fh1>) {
    my ($id, $min, $max) = split;

    my @letters2 = grep $hash2{$_} >= $min && $hash2{$_} <= $max, 
        sort keys %hash2;
    my @letters3 = grep $hash3{$_} >= $min && $hash3{$_} <= $max, 
        sort keys %hash3;

    print join(" ", $id, @letters2,
                    @letters2 ? 'file2' : (),
                    @letters3,
                    @letters3 ? 'file3' : ()
               ), "\n";
}
close $fh1 or die $!;
更新:一种更好的方法,允许2个以上的文件

#!/usr/bin/perl
use strict;
use warnings;

my %name_num;
my @file = qw/file2 file3/;

for my $file (@file) {
    open my $fh, '<', $file or die $!;
    %{ $name_num{$file} } = map split, <$fh>;
}

open my $fh1, '<', 'file1' or die $!;
while (<$fh1>) {
    my ($id, $min, $max) = split;
    print $id;

    for my $file (@file) {
        my @letters =
            grep $name_num{$file}{$_} >= $min && $name_num{$file}{$_} <= $max, 
                sort keys %{$name_num{$file}};

        if (@letters) {
            print join(" ", '', @letters, $file);
        }
    }
    print "\n"; 
}
close $fh1 or die $!;
!/usr/bin/perl
严格使用;
使用警告;
我的%name\u num;
my@file=qw/file2 file3/;
对于我的$file(@file){
打开我的$fh,“只是另一种方法

#!/usr/bin/perl
use strict;
use warnings;

open my $fh2, '<', 'file2' or die $!;
my %hash2 = map split, <$fh2>;
close $fh2 or die $!;

open my $fh3, '<', 'file3' or die $!;
my %hash3 = map split, <$fh3>;
close $fh3 or die $!;

open my $fh1, '<', 'file1' or die $!;
while (<$fh1>) {
    my ($id, $min, $max) = split;

    my @letters2 = grep $hash2{$_} >= $min && $hash2{$_} <= $max, 
        sort keys %hash2;
    my @letters3 = grep $hash3{$_} >= $min && $hash3{$_} <= $max, 
        sort keys %hash3;

    print join(" ", $id, @letters2,
                    @letters2 ? 'file2' : (),
                    @letters3,
                    @letters3 ? 'file3' : ()
               ), "\n";
}
close $fh1 or die $!;
更新:一种更好的方法,允许2个以上的文件

#!/usr/bin/perl
use strict;
use warnings;

my %name_num;
my @file = qw/file2 file3/;

for my $file (@file) {
    open my $fh, '<', $file or die $!;
    %{ $name_num{$file} } = map split, <$fh>;
}

open my $fh1, '<', 'file1' or die $!;
while (<$fh1>) {
    my ($id, $min, $max) = split;
    print $id;

    for my $file (@file) {
        my @letters =
            grep $name_num{$file}{$_} >= $min && $name_num{$file}{$_} <= $max, 
                sort keys %{$name_num{$file}};

        if (@letters) {
            print join(" ", '', @letters, $file);
        }
    }
    print "\n"; 
}
close $fh1 or die $!;
!/usr/bin/perl
严格使用;
使用警告;
我的%name\u num;
my@file=qw/file2 file3/;
对于我的$file(@file){
打开我的$fh,“只是另一种方法

#!/usr/bin/perl
use strict;
use warnings;

open my $fh2, '<', 'file2' or die $!;
my %hash2 = map split, <$fh2>;
close $fh2 or die $!;

open my $fh3, '<', 'file3' or die $!;
my %hash3 = map split, <$fh3>;
close $fh3 or die $!;

open my $fh1, '<', 'file1' or die $!;
while (<$fh1>) {
    my ($id, $min, $max) = split;

    my @letters2 = grep $hash2{$_} >= $min && $hash2{$_} <= $max, 
        sort keys %hash2;
    my @letters3 = grep $hash3{$_} >= $min && $hash3{$_} <= $max, 
        sort keys %hash3;

    print join(" ", $id, @letters2,
                    @letters2 ? 'file2' : (),
                    @letters3,
                    @letters3 ? 'file3' : ()
               ), "\n";
}
close $fh1 or die $!;
更新:一种更好的方法,允许2个以上的文件

#!/usr/bin/perl
use strict;
use warnings;

my %name_num;
my @file = qw/file2 file3/;

for my $file (@file) {
    open my $fh, '<', $file or die $!;
    %{ $name_num{$file} } = map split, <$fh>;
}

open my $fh1, '<', 'file1' or die $!;
while (<$fh1>) {
    my ($id, $min, $max) = split;
    print $id;

    for my $file (@file) {
        my @letters =
            grep $name_num{$file}{$_} >= $min && $name_num{$file}{$_} <= $max, 
                sort keys %{$name_num{$file}};

        if (@letters) {
            print join(" ", '', @letters, $file);
        }
    }
    print "\n"; 
}
close $fh1 or die $!;
!/usr/bin/perl
严格使用;
使用警告;
我的%name\u num;
my@file=qw/file2 file3/;
对于我的$file(@file){


打开我的$fh,'当
file3
中的
d=23
且间隔为
[30 40]时,为什么会得到
8cdfile3
from
file1
?它不应该只是
8c file3
?为什么区间3是空的,当
a=9
from
file3
属于区间3时?我试图解释我的程序逻辑,你说对了,你能帮我一下吗?我可以试着帮你…这样你上面显示的输出就不正确了根据你输入的文件?我没有得到正确输出的正确代码。你能告诉我怎么做吗。当
file3
d=23
且间隔为
[30 40]时,你为什么会得到
8cdfile3
from
file1
?它不应该只是
8c file3
?为什么区间3是空的,当
a=9
from
file3
属于区间3时?我试图解释我的程序逻辑,你说对了,你能帮我一下吗?我可以试着帮你…这样你上面显示的输出就不正确了根据你输入的文件?我没有得到正确输出的正确代码。你能告诉我怎么做吗。当
file3
d=23
且间隔为
[30 40]时,你为什么会得到
8cdfile3
from
file1
?它不应该只是
8c file3
?为什么区间3是空的,当
a=9
from
file3
属于区间3时?我试图解释我的程序逻辑,你说对了,你能帮我一下吗?我可以试着帮你…这样你上面显示的输出就不正确了根据你输入的文件?我没有得到正确输出的正确代码。你能告诉我怎么做吗。当
file3
d=23
且间隔为
[30 40]时,你为什么会得到
8cdfile3
from
file1
?它不应该只是
8c file3
?为什么区间3是空的,当
a=9
from
file3
属于区间3时?我试图解释我的程序逻辑,你说对了,你能帮我一下吗?我可以试着帮你…这样你上面显示的输出就不正确了根据你输入的文件?我没有得到正确输出的正确代码。你能告诉我怎么做吗。@Borodin谢谢!我错过了。我在想
使用v5.12
会隐式启用它,但它似乎只启用
严格的
杂注吗?事实上是的。我写了一条注释,解释了到底发生了什么@Borodin谢谢!我错过了。我在想
use v5.12
会隐式启用它,但它似乎只启用
strict
pragma?实际上是的。我写了一篇评论,解释了happens@Borodin谢谢!我错过了。我在想
使用v5.12
会隐式启用它,但似乎只是启用
strict
pragma?实际上是的。我写了一条注释,解释了happens@Borodin谢谢!我错过了。我在想
use v5.12
会隐式启用它,但它似乎只启用
strict
pragma?实际上是的。我写了一条注释,解释了发生的事情@“Håkon Hægland”谢谢Håkon Hægland“Håkon Hægland”谢谢Håkon Hægland“Håkon Hægland”谢谢Håkon