Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl Awk-从一个文件中获取包含另一个文件中描述的范围内的值的行_Perl_Shell_Awk - Fatal编程技术网

Perl Awk-从一个文件中获取包含另一个文件中描述的范围内的值的行

Perl Awk-从一个文件中获取包含另一个文件中描述的范围内的值的行,perl,shell,awk,Perl,Shell,Awk,我有两个以制表符分隔的文件,格式与此类似: 文件1 A 100 90 PASS B 89 80 PASS C 79 70 PASS D 69 60 FAIL F 59 0 FAIL 文件2 Randy 80 Denis 44 Earl 97 我想从文件2中的第2列获取值,并将它们与文件1的第2列和第3列之间给定的范围进行比较。然后,我想创建一个新文件来组合这些数据,从文件2打印第1列和第2列,从文件1打印第1列和第4列: 文件3 Randy 80 B PASS Denis 44 F FAIL

我有两个以制表符分隔的文件,格式与此类似:

文件1

A 100 90 PASS
B 89 80 PASS
C 79 70 PASS
D 69 60 FAIL
F 59 0 FAIL
文件2

Randy 80
Denis 44
Earl 97
我想从文件2中的第2列获取值,并将它们与文件1的第2列和第3列之间给定的范围进行比较。然后,我想创建一个新文件来组合这些数据,从文件2打印第1列和第2列,从文件1打印第1列和第4列:

文件3

Randy 80 B PASS
Denis 44 F FAIL
Earl 97 A PASS

我想使用awk或perl实现这一点。

在perl中,我可能会这样做:

#!/usr/bin/env perl
use strict;
use warnings 'all';
use Data::Dumper;

open ( my $grades_in, '<', "file1.txt" ) or die $!;
my @grade_lookup = map { [split] } <$grades_in>;
print Dumper \@grade_lookup;
close ( $grades_in ); 

open ( my $people, '<', "file2.txt" ) or die $!; 
while (<$people>) {
   chomp;
   my ( $person, $score ) = split;
   my ( $grade ) = grep { $_ -> [1] >= $score 
                     and $_ -> [2] <= $score } @grade_lookup;
   print join " ", $person, $score, $grade -> [0], $grade -> [3], "\n";
} 
close ( $people ); 

在perl中,我可能会这样做:

#!/usr/bin/env perl
use strict;
use warnings 'all';
use Data::Dumper;

open ( my $grades_in, '<', "file1.txt" ) or die $!;
my @grade_lookup = map { [split] } <$grades_in>;
print Dumper \@grade_lookup;
close ( $grades_in ); 

open ( my $people, '<', "file2.txt" ) or die $!; 
while (<$people>) {
   chomp;
   my ( $person, $score ) = split;
   my ( $grade ) = grep { $_ -> [1] >= $score 
                     and $_ -> [2] <= $score } @grade_lookup;
   print join " ", $person, $score, $grade -> [0], $grade -> [3], "\n";
} 
close ( $people ); 
您可以使用此awk:

awk 'BEGIN{FS=OFS="\t"}
FNR==NR {
   a[$0] = $2
   next
}
{
   for (i in a)
      if ($2>=a[i] && $3<=a[i])
         print i, $1, $4
}' file2 file1
您可以使用此awk:

awk 'BEGIN{FS=OFS="\t"}
FNR==NR {
   a[$0] = $2
   next
}
{
   for (i in a)
      if ($2>=a[i] && $3<=a[i])
         print i, $1, $4
}' file2 file1
在Perl中

使用严格;
使用“全部”警告;
使用自动模具;
使用列表::Util'first';
我的@grades=do{
在Perl中打开我的$fh,“

使用严格;
使用“全部”警告;
使用自动模具;
使用列表::Util'first';
我的@grades=do{

打开我的$fh,'继续并尝试…这些可能会有帮助:,,继续并尝试…这些可能会有帮助:,