0

perl を使用して、テキスト ファイル内の値のコンマ区切りリストの複数行を変換しようとしています。

最初のファイルは次のようになります。

A:25, B:14, C:3
A:25, E:5
B:14, D:8, E:5  

2 番目のファイルはタブ区切りで、次のようになります。

A:25   AS363
B:14   SDD645
C:3    KF8756
D:8    LFK4523
E:5    FSE523

理想的には、出力を元のファイルのようにカンマ区切りにしたいのですが、すべてが変換されるだけなので、出力は次のようになります。

AS363, SDD645, KF8756
AS363, FSE523
SDD645, LFK4523, FSE523

これまでの私のコードは次のとおりです。

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

my $filename = $ARGV[0];
my $filename1 = $ARGV[1];

open(FILE, $filename);

while (my $line = <FILE>){
          my @items = split /\s*,\s*/, $line;
             foreach my $items (@items) {
            #print "$items\n";
}
}
close FILE;

open(FILE1, $filename1);

while (my $line1 = <FILE1>) 

{

    my @ids = split /[\r\n\t]/,$line1;
    #print "$ids[1]\n";

    if (my $items==$ids[1]){
    print "$ids[1]\n";
    }
}

close FILE1;

最初の部分の $items はグローバルではないため、この時点で失敗しているようです... 最初の while ループをすべて拡張しても、それも機能しないため、どうすればよいかわかりません。また、カンマ区切りに変換しようとしているだけですが、次のようなものを使用する必要があると想定しています

join (",", ...)

しかし、これもうまくいかないようです...アドバイスはありますか?ありがとう!

4

1 に答える 1

2

一般的なアプローチは、1 つのファイル (この場合は 2 番目のファイル) を 1 行ずつ読み取り、ハッシュを使用してデータを保存することです。検索するデータをキーとして、置換するデータを値として指定します。後でもう一方も 1 行ずつ読み取り、フィールドに分割し、それぞれについてハッシュに存在するかどうかを比較します。

#!/usr/bin/env perl

use warnings;
use strict;

my %hash;

die qq|Usage: perl $0 <file1> <file2>\n| unless @ARGV == 2;

open my $fh1, '<', shift or die;
open my $fh2, '<', shift or die;

while ( <$fh2> ) { 
    s/\s+$//;
    my @f = split;
    next unless @f == 2;
    $hash{ $f[0] } = $f[1];
}

while ( <$fh1> ) { 
    s/\s+$//;
    my @f = split /, /;
    for my $elem ( @f ) { 
        if ( defined $hash{ $elem } ) { 
            $elem = $hash{ $elem };
        }   
    }   
    printf qq|%s\n|, join q|, |, @f; 
}

次のように実行します。

perl script.pl file1 file2

それは以下をもたらします:

AS363, SDD645, KF8756
AS363, FSE523
SDD645, LFK4523, FSE523
于 2013-10-07T21:00:30.253 に答える