2011-07-28 140 views
2

我有這個腳本,比較兩個文件並打印出不同的結果。現在我想更改腳本而不是打印出差異線,我想打印匹配的線。還要計算每次運行腳本時匹配的時間。你能請任何人給我一個建議。謝謝!perl比較兩個文件並打印匹配的行

#! /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} == 1if $results{$line} != 1

要添加計數:

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

或者,你可以過濾掉不需要用grep,避免完全的if條件:

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

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

非常感謝您的回答太滿,滿足我的主要目標,但不是第二個目標。我覺得我還不夠清楚。對不起。我想讓櫃檯告訴我他們有多少次匹配。例。該腳本每週運行一次,因此計數器每次運行都會添加1個數字。所以如果我在4周後看到'4',那就意味着設備在那裏4周,如果第二條線匹配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。

您可以將0代替其中一個名稱與其他文件進行比較。使用shell重定向將其保存到文件。

用法:

$ 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周,如果第二條線匹配3次,這意味着設備在那裏3周等等。只是我的目標是要知道每個設備匹配多少星期。 – eli

+1

我不太清楚你在這裏問什麼,以及它與你已有的有什麼不同。一般來說,在StackOverflow上一次要求所有的目標會更好,而不是試圖一件一件拼湊出解決方案。我認爲你所要求的需要一個新的問題,最好有一些樣本輸入/輸出。 – TLP

+0

您解決方案的計數器顯示有多少項目匹配我的目標是它匹配多長時間的計數器。即使我已經運行腳本10次,解決方案上的計數器仍會顯示「2」。我的期望是向我展示「10」,因爲腳本運行了10次並與當前列表相匹配。對於混淆抱歉,但這是我原來的目標,我沒有增加新的目標。英語也是我的第三語言,所以請考慮! – eli

相關問題