2011-07-28 29 views
2

私は2つのファイルを比較し、diff結果を出力するこのスクリプトを持っています。今私はdiff行を印刷する代わりにスクリプトを変更したい、私は一致する行を印刷したい。また、スクリプトを実行するたびに一致する回数をカウントすることもできます。誰かが私に提案をお願いします。ありがとう!perlは2つのファイルを比較し、一致する行を出力します

#! /usr/local/bin/perl 
# compare 
my $f1 = "/opt/test.txt"; 
my $f2 = "/opt/test1.txt"; 
my $outfile = "/opt/final_result.txt"; 
my %results =(); 
open FILE1, "$f1" or die "Could not open file: $! \n"; 
while(my $line = <FILE1>){ $results{$line}=1; 
} 
close(FILE1); 
open FILE2, "$f2" or die "Could not open file: $! \n"; 
while(my $line =<FILE2>) { 
$results{$line}++; 
} 
close(FILE2); 
open (OUTFILE, ">$outfile") or die "Cannot open $outfile for writing \n"; 
foreach my $line (keys %results) { print OUTFILE $line if $results{$line} == 1; 
} 
close OUTFILE; 

答えて

1

これは、物事を行うにはクリーンな方法ではありません...しかし、ハードワークが行われています。論理を逆にして、すべてを印刷するようにしてくださいunless $results{$line} == 1、またはif $results{$line} != 1。完全if条件を避け、

print OUTFILE "Count: $results{$line} - $line" if $results{$line} != 1; 

また、あなたがgrepで不要なをフィルタリングできます:

は、カウントを追加するには

foreach my $line (grep { $results{$_} != 1 } keys %results) { 

    print OUTFILE "Count: $results{$line} - $line"; 
} 
+0

あなたの答えがあまりにも私の主要な目標を満たしていない多くのおかげで、2番目のものはありません。私は十分にはっきりしていないと思う。申し訳ありません。カウンターに何回マッチしたか教えてください。例。スクリプトは毎週実行されるので、カウンターは毎回1つの番号を追加します。 4週間後にデバイスを意味する行の隣に '4'が表示された場合、4週間後に2番目の行が3週間一致すると、3週間デバイスを意味するとしましょう。単に私の目的は、各デバイスが何週間になるかを知ることです。 – eli

2
print OUTFILE $line if $results{$line} == 1; 

これは一度だけ発生する行を出力します。

print OUTFILE $line if $results{$line} > 1; 

小さな変化(>から==)の一つ、それが今で複数回発生する行を出力します。それは同じ重複した行を出力するはずです。あなたは、カウントをしたい場合

ああ、また、単に実行します。

if ($results{$line} > 1) { 
    print OUTFILE "$results{$line}: ", $line; 
} 

私はここに、より簡潔で、より柔軟なバージョンを書きました。オプションのファイル名をとり、STDOUTに出力します。

名前の1つの代わりに0を置き、ファイルの1つを別のファイルと比較することができます。シェルリダイレクトを使用してファイルに保存します。

用途:

$ script.pl file1.txt file2.txt > outfile.txt 

コード:

use strict; 
use warnings; 
use autodie; 

my $f1 = shift || "/opt/test.txt"; 
my $f2 = shift || "/opt/test1.txt"; 
my %results; 
open my $file1, '<', $f1; 
while (my $line = <$file1>) { $results{$line} = 1 } 
open my $file2, '<', $f2; 
while (my $line = <$file2>) { $results{$line}++ } 
foreach my $line (sort { $results{$b} <=> $results{$a} } keys %results) { 
    print "$results{$line}: ", $line if $results{$line} > 1; 
} 
+0

ので、どうもありがとうございました!私の主な目的が達成される。私の二次的異論は、一致したデバイスがファイルから削除されるべきであるということです。カウンターに何回マッチしたか教えてもらいたい。例。スクリプトは毎週実行されるので、カウンターは毎回1つの番号を追加します。 4週間後にデバイスを意味する行の隣に '4'が表示された場合、4週間後に2番目の行が3週間一致すると、3週間デバイスを意味するとしましょう。単に私の目的は、各デバイスが何週間になるかを知ることです。 – eli

+1

私はあなたがここで何を求めているのか、それがあなたがすでに持っているものとどのように違うのかよく分かりません。一般的には、StackOverflowで一度にすべての目的を尋ねる方がいいです。あなたが求めているのは、新しい質問が必要だと思います。いくつかのサンプル入力/出力が必要です。 – TLP

+0

あなたのカウンターのカウンターには、一致するアイテムの数が表示されます。私の目的は、一致した時間のカウンターです。スクリプトを10回実行したにもかかわらず、あなたのソリューションのカウンターに「2」が表示されます。私の期待は、スクリプトが10回実行されてから現在のリストと一致したので私に "10"を表示することでした。混乱をおかけして申し訳ありませんが、これは私の新しい目的を追加したものではありません。また、英語は私の第3言語ですので、考慮に入れてください! – eli

0

がテスト::の違いを試してみてください。コードサンプルとどのように出力は次のようになりますは、ここを参照してください:

http://metacpan.org/pod/Test::Differences

関連する問題