0

単純なことで困っています。2 つのファイルを比較して、2 つのファイル間で一致しないパターンのみを書き込む必要があります。

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

1 A A
2 A B
3 C D
4 E F
5 G H
6 I L

2 番目のファイルは次のようになります。

A A
A B
C D

私が望むのは、2 番目のファイルのペア リストを使用して、最初のファイルの一致しない行を選択し、それらを出力に出力することです。私の望ましい出力は次のようになります。

4 E F
5 G H
6 I L

以下の私のコードは改善が必要であり、それを行うにはあなたの助けが必要です!

open (FUS, "< $file_1")|| die "Impossible open file 1";
@f = <FUS>;
close (FUS);

open (ALL, "< $file_2")|| die "Impossible open file 2";
@a = <ALL>;
close (ALL);

for ($c=0; $c<=$#a; $c++) {
    chomp ($a[$c]);
    @q = split (/\t/, $a[$c]);
    $qok = $q[0]."\t".$q[1];
    $qko = $q[1]."\t".$q[0];

    for ($t=0; $t<=$#f; $t++) {
        chomp ($f[$t]);
        ($id, $pf1, $pf2) = split (/\t/, $f[$t]);
        $pf_12 = $pf1."\t".$pf2;
        $pf_21 = $pf2."\t".$pf1;

        if ((($qok ne $pf_12) && ($qko ne $pf_12)) || (($qok ne $pf_21) && ($ko ne $pf_21))){
            print "$id\t$pf1\t$pf2\n";
        }
    }
}

このコードの問題は、ループにあるため、目的の結果ではなく間違った結果が得られることです。

どんな提案でも大歓迎です!

4

3 に答える 3

1

ファイルが大きすぎない場合は、ハッシュの使用をお勧めします。

1) 文字列の必要な一致部分をキーとして使用して %hash_a を埋めます。ファイルを読み取った後、このハッシュには次の内容が含まれます。

%hash_a = (
'A A' => '1 A A',
'A B' => '2 A B',
...
'I L' => '6 I L'
);

2) 2 番目のファイルを繰り返し、%hash_a から適切なキーを削除します。

$key =<$file>;
chomp $key;
delete $hash_a{$key};

3) 残りのキーを %hash_a に出力します

また、次のことをお勧めします。

  • これをスクリプトの先頭に置きます:
use strict;
use warnings;
  • ファイルを処理するための最新のアプローチを使用します。
open my $FUS, '<', $file_1 or die "Cannot open $file_1: $!";
于 2013-08-06T11:30:39.790 に答える