Perl根据条件从两个文件中提取列

时间:2019-11-05 19:51:04

标签: perl hash file-comparison

我有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(来自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'});   
}

请根据上述条件帮助我获取上述数据文件的输出。

1 个答案:

答案 0 :(得分:1)

这是一个使用数组数组作为%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