-1

2 つのファイルを比較する必要があります。最初のファイルにはいくつかの ID ペアがあり、2 番目のファイルには 2 つのスタイル (列ごとに 1 つ) で記述された ID リストがあります。それらは次のようになります。

ファイル 1

IDnew_1 IDnew_2
IDnew_3 IDnew_4
IDnew_5 IDnew_6
IDnew_7 IDnew_8

ファイル 2

IDnew_1 IDold_1
IDnew_2 IDold_2
IDnew_7 IDold_7
IDnew_8 IDold_8

次のような出力を取得したいと思います。

IDold_1 IDold_2
IDold_7 IDold_8

実際には、ファイル 1 を「ファイル 2 にある古いスタイルの ID に「翻訳」する必要があります。 で何かを試しましたが、ファイル 2 のperl2 つの列を操作できません。私の perl コードは次のようになります。

$file_GS = "file1.txt";
$file_orto = "file2.txt";
open (HAN, "< $file_orto") || die "Impossible open input orto";
@r = <HAN>;
close (HAN);
open (GAS, "< $file_GS") || die "Immposible open GS file";
@p = <GAS>;
close (GAS);

for ($i=0; $i<=$#r; $i++){
chomp ($r[$i]);
@orto = split ( /\t/, $r[$i]);
$old = $orto[0];
$new = $orto[1];

for ($l=0; $l<=$#p; $l++){
chomp ($p[$l]);
@v = split (/\t/, $p[$l]);
$gs1 = $v[0];
$gs2 = $v[1];

if ($gs1 eq pf_old){
print "$pb\n";
}
}
}

このコードは 1 つの列のみを書き込み、出力は次のようになります。

IDold_1
IDold_7

....出力の両方の列を表示するにはどうすればよいですか? 提案?
ありがとうございました!!

4

2 に答える 2

0

まず、「翻訳」ファイルをハッシュします。次に、両方の ID の翻訳が見つかった行を印刷します。

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

my $file_gs   = 'file1.txt';
my $file_orto = 'file2.txt';

my %translate;
open my $ORTO, '<', $file_orto or die $!;
while (<$ORTO>) {
    my ($new, $old) = split;
    die "Duplicate $old" if exists $translate{$old};
    $translate{$new} = $old;
}

open my $GS, '<', $file_gs or die $!;
while (<$GS>) {
    my @ids = grep defined, map $translate{$_}, split;
    print "@ids\n" if 2 == @ids;
}
于 2013-06-06T16:10:14.713 に答える