2

私が書いた perl スクリプトの 1 つから生成した 2 つのテキスト ファイルを比較したいと思います。これら 2 つのテキスト ファイルから一致した結果を出力したいと考えています。スタックオーバーフローで人々が尋ねたいくつかの回答と質問を見てみましたが、うまくいきません。これが私が試したことです。

my $file1 = "Scan1.txt";
my $file2 = "Scan2.txt";
my $OUTPUT = "final_result.txt";
my %results = (); 
open FILE1, "$file1" or die "Could not open $file1 \n";
   while(my $matchLine = <FILE1>)
       {   
         $results{$matchLine} = 1;
    }
    close(FILE1); 
    open FILE2, "$file2" or die "Could not open $file2 \n";
   while(my $matchLine =<FILE2>) 
        {  
    $results{$matchLine}++;
        }
    close(FILE2);  
    open (OUTPUT, ">$OUTPUT") or die "Cannot open $OUTPUT \n";
    foreach my $matchLine (keys %results) { 
    print OUTPUT $matchLine if $results{$matchLine} ne 1;
    }
    close OUTPUT;

希望する出力の例

FILE1.TXT データ 1 データ 2 データ 3

FILE2.TXT データ2 データ1

OUTPUT データ 1 データ 2

4

1 に答える 1

1

問題は、ハッシュが次の状態になっていることです。

  • 0 (行がどこにも見つからない),
  • 1 (file1 で見つかった行または file2 で 1 回見つかった行),
  • 2 (ファイル 1 で見つかった行とファイル 2 で 1 回、またはファイル 2 で 2 回見つかった行)
  • n (file1 で見つかった行と file2 で n-1 回見つかった行、または file2 で n 回見つかった行)

このあいまいさにより、チェック (ハッシュ ne 1) が失敗します。

アルゴリズムに最低限必要な変更は次のとおりです。

my $file1 = "Scan1.txt";
my $file2 = "Scan2.txt";
my $OUTPUT = "final_result.txt";
my %results = (); 
open FILE1, "$file1" or die "Could not open $file1 \n";
   while(my $matchLine = <FILE1>)
       {   
         $results{$matchLine} = 1;
    }
    close(FILE1); 
    open FILE2, "$file2" or die "Could not open $file2 \n";
   while(my $matchLine =<FILE2>) 
        {  
    $results{$matchLine} = 2 if $results{$matchLine}; #Only when already found in file1
        }
    close(FILE2);  
    open (OUTPUT, ">$OUTPUT") or die "Cannot open $OUTPUT \n";
    foreach my $matchLine (keys %results) { 
    print OUTPUT $matchLine if $results{$matchLine} ne 1;
    }
    close OUTPUT;
于 2012-05-23T17:01:38.470 に答える