Perl 根据条件从两个文件中提取列
Perl extract columns from two files based on condition
我有 2 个文件,比如 file1 和 file2。
file1.txt
RAC1 GK1 111
RAC2 GK2 222
RAC1 GK3 333
RAC1 GK4 222
RAC2 GK5 111
file2.txt
R1,PAAE,222,TESTA,COLA,NO
R2,RWWG,111,TESTB,COLM,YES
R3,TDAS,444,TESTC,COLZ,NO
我正在比较 2 个文件并尝试从中提取数据。这里的条件是,如果 file1 的 Column3 值与 file2 的 Column3 值匹配,则打印以下输出 -
RAC1,GK1,111,R2,RWWG,TESTB,COLM,YES
RAC2,GK5,111,R2,RWWG,TESTB,COLM,YES
RAC2,GK2,222,R1,PAAE,TESTA,COLA,NO
RAC1,GK4,222,R1,PAAE,TESTA,COLA,NO
我已经为此编写了一个脚本,将 file1 column2 值作为键。但是此列值在 file2 中不存在。所以比较是行不通的。
即使我无法将 column3(from file1) 作为键,因为它有重复的值。
下面的代码 -
my %hash1 = ();
open(FH1, "file1.txt");
while(<FH1>){
chomp($_);
my @val = split(' ', $_);
$hash1{$val[1]}{'RAC_VAL'} = $val[0];
$hash1{$val[1]}{'ID'} = $val[2];
}
#print Dumper(\%hash1);
open(FH2, "file2.txt");
while(<FH2>){
chomp($_);
my @array = split(',', $_);
print "$hash1{$array[2]}{'RAC_VAL'},,$hash1{$array[2]}{'ID'},$array[0],$array[1],$array[3],$array[4],$array[5]\n" if(exists $hash1{$array[2]}{'ID'});
}
请帮我根据上述条件获取上述数据文件的输出。
这是一个使用数组的数组作为 %hash1
中的值的示例(因为键不是唯一的):
use feature qw(say);
use strict;
use warnings;
my %hash1;
open(FH1, "file1.txt");
while(<FH1>){
chomp($_);
my @val = split(' ', $_);
push @{ $hash1{$val[2]} }, [ @val[0,1] ];
}
open(FH2, "file2.txt");
while(<FH2>){
chomp($_);
my @array = split(',', $_);
if ( exists $hash1{$array[2]} ) {
for my $item ( @{ $hash1{$array[2]} } ) {
say join ',', @$item, @array[0,1,3,4,5];
}
}
}
输出:
RAC2,GK2,R1,PAAE,TESTA,COLA,NO
RAC1,GK4,R1,PAAE,TESTA,COLA,NO
RAC1,GK1,R2,RWWG,TESTB,COLM,YES
RAC2,GK5,R2,RWWG,TESTB,COLM,YES
我有 2 个文件,比如 file1 和 file2。
file1.txt
RAC1 GK1 111
RAC2 GK2 222
RAC1 GK3 333
RAC1 GK4 222
RAC2 GK5 111
file2.txt
R1,PAAE,222,TESTA,COLA,NO
R2,RWWG,111,TESTB,COLM,YES
R3,TDAS,444,TESTC,COLZ,NO
我正在比较 2 个文件并尝试从中提取数据。这里的条件是,如果 file1 的 Column3 值与 file2 的 Column3 值匹配,则打印以下输出 -
RAC1,GK1,111,R2,RWWG,TESTB,COLM,YES
RAC2,GK5,111,R2,RWWG,TESTB,COLM,YES
RAC2,GK2,222,R1,PAAE,TESTA,COLA,NO
RAC1,GK4,222,R1,PAAE,TESTA,COLA,NO
我已经为此编写了一个脚本,将 file1 column2 值作为键。但是此列值在 file2 中不存在。所以比较是行不通的。
即使我无法将 column3(from file1) 作为键,因为它有重复的值。
下面的代码 -
my %hash1 = ();
open(FH1, "file1.txt");
while(<FH1>){
chomp($_);
my @val = split(' ', $_);
$hash1{$val[1]}{'RAC_VAL'} = $val[0];
$hash1{$val[1]}{'ID'} = $val[2];
}
#print Dumper(\%hash1);
open(FH2, "file2.txt");
while(<FH2>){
chomp($_);
my @array = split(',', $_);
print "$hash1{$array[2]}{'RAC_VAL'},,$hash1{$array[2]}{'ID'},$array[0],$array[1],$array[3],$array[4],$array[5]\n" if(exists $hash1{$array[2]}{'ID'});
}
请帮我根据上述条件获取上述数据文件的输出。
这是一个使用数组的数组作为 %hash1
中的值的示例(因为键不是唯一的):
use feature qw(say);
use strict;
use warnings;
my %hash1;
open(FH1, "file1.txt");
while(<FH1>){
chomp($_);
my @val = split(' ', $_);
push @{ $hash1{$val[2]} }, [ @val[0,1] ];
}
open(FH2, "file2.txt");
while(<FH2>){
chomp($_);
my @array = split(',', $_);
if ( exists $hash1{$array[2]} ) {
for my $item ( @{ $hash1{$array[2]} } ) {
say join ',', @$item, @array[0,1,3,4,5];
}
}
}
输出:
RAC2,GK2,R1,PAAE,TESTA,COLA,NO
RAC1,GK4,R1,PAAE,TESTA,COLA,NO
RAC1,GK1,R2,RWWG,TESTB,COLM,YES
RAC2,GK5,R2,RWWG,TESTB,COLM,YES