用于检查间隔的perl代码
输入文件1:包含下限和上限用于检查间隔的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: 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
fromfile1
?它不应该只是8c file3
?为什么区间3是空的,当a=9
fromfile3
属于区间3时?我试图解释我的程序逻辑,你说对了,你能帮我一下吗?我可以试着帮你…这样你上面显示的输出就不正确了根据你输入的文件?我没有得到正确输出的正确代码。你能告诉我怎么做吗。当file3
中d=23
且间隔为[30 40]时,你为什么会得到8cdfile3
fromfile1
?它不应该只是8c file3
?为什么区间3是空的,当a=9
fromfile3
属于区间3时?我试图解释我的程序逻辑,你说对了,你能帮我一下吗?我可以试着帮你…这样你上面显示的输出就不正确了根据你输入的文件?我没有得到正确输出的正确代码。你能告诉我怎么做吗。当file3
中d=23
且间隔为[30 40]时,你为什么会得到8cdfile3
fromfile1
?它不应该只是8c file3
?为什么区间3是空的,当a=9
fromfile3
属于区间3时?我试图解释我的程序逻辑,你说对了,你能帮我一下吗?我可以试着帮你…这样你上面显示的输出就不正确了根据你输入的文件?我没有得到正确输出的正确代码。你能告诉我怎么做吗。当file3
中d=23
且间隔为[30 40]时,你为什么会得到8cdfile3
fromfile1
?它不应该只是8c file3
?为什么区间3是空的,当a=9
fromfile3
属于区间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