2016-03-03 22 views
0

我寫了thsi腳本來比較兩個文件的行,並將常用/不常用行輸出到兩個不同的文件中。該腳本是:Perl - 使用特定子串的文件比較

use strict; 
use warnings; 
use autodie; 

my $f1 = shift || "CSP8216.TXT";            
my $f2 = shift || "CSP8217.TXT";            

open my $fh1, '>', 'file1'; 
open FH2, '>', 'file2'; 

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) 
{ 
    if ($results{$line} >= 1) 
    { 
    print {$fh1} "$line"; 
    } 
    else 
    { 
    print FH2 "$line"; 
    } 
} 

我的問題是,當我嘗試根據各行的具體子,即國防部這個腳本,但運行的比較:

  • 如果一行文件中的特定字符串A匹配文件B中一行的另一個特定子字符串,然後將文件B的所有/整行/行輸出到fh1,否則將其輸出到fh2。

我想這一點,但它不工作 - 真正的新的Perl的是,任何幫助將是非常讚賞:

use strict; 
use warnings; 
use autodie; 

my $f1 = shift || "CSP8216.TXT";            
my $f2 = shift || "CSP8216.TXT";            

open my $fh1, '>', 'file1'; 
open FH2, '>', 'file2'; 

my %results; 

open my $file1, '<', $f1;             
while (my $line = <$file1>) 
{ 
    my $sbs1 = substr($line, 0, 10); 
    $results{$sbs1} = 1 
}       

open my $file2, '<', $f2;             
while (my $line = <$file2>) 
{ 
    my $sbs2 = substr($line, 0, 10); 
    $results{$sbs2}++ 
}       

foreach my $line (sort { $results{$b} <=> $results{$a} } keys %results) 
{ 
    if ($results{$line} >= 1) 
    { 
    print {$fh1} "$line"; 
    } 
    else 
    { 
    print FH2 "$line"; 
    } 
} 

這不工作,我有一種感覺它的一個問題邏輯,它只輸出一行中的子字符串。

+1

如果相同的內容出現兩次按預期你的代碼不能正常工作在文件A或文件B中。解決方案是爲每個文件使用單獨的散列,然後檢查兩個散列中是否存在一行。 – pmakholm

+0

'$ results {$ line}> = 1'應該是'$ results {$ line}> 1',否則(根據代碼)所有行在兩個文件中都是相同的。 –

回答

2

根據我的評論,如果我們需要支持單行可以在一個文件中出現兩次,我們需要保持文件A和文件B分開的行。

在選擇是要解決的基本問題是這樣

open my $fh1, '<', $filename1 or die "Can't open $file1: $!"; 
while (my $line = <$fh1>) { 
    $combined{$line} = $file1{$line} = 1; 
} 

open my $fh2, '<', $filename2 or die "Can't open $file2: $!"; 
while (my $line = <$fh2>) { 
    $combined{$line} = $file2{$line} = 1; 
} 

open my $out1, '>', $outfilename1 or die "..."; 
open my $out2, '>', $outfilename2 or die "..."; 

for my $line (keys %combined) { 
    if ($file1{$line} && $file2{$line}) { 
     print $out1 $line; 
    } else { 
     print $out2 $line; 
    } 
} 

爲了解決這個問題,子我會保持子從每個文件的哈希鍵。但是,而不是僅僅存儲的真正價值我會完整的字符串存儲爲值%文件2:

open my $fh1, '<', $filename1 or die "Can't open $file1: $!"; 
while (my $line = <$fh1>) { 
    my $substr = substr($line, 0, 10); 
    $combined{$line} = $file1{$substr} = 1; 
} 

open my $fh2, '<', $filename2 or die "Can't open $file2: $!"; 
while (my $line = <$fh2>) { 
    my $substr = substr($line, 20, 30); 
    $combined{$line} = 1; 
    $file2{$substr} = $line; 
} 

open my $out1, '>', $outfilename1 or die "..."; 
open my $out2, '>', $outfilename2 or die "..."; 

for my $line (keys %combined) { 
    my $substr1 = substr($line, 0, 10); 
    my $substr2 = substr($line, 20, 30); 
    if ($file1{$substr1} && $file2{$substr2}) { 
     print $out1 $file2{$substr2}; 
    } else { 
     print $out2 $line; 
    } 
} 
+0

我已經嘗試過不同版本的代碼,我可以只編輯我的原始帖子或嘗試新的嗎? – onlyf

0

這對我的作品

#!/usr/bin/perl 

use warnings; 
use autodie; 

my %results; 

my $f1 = shift || "CSP8216.TXT"; 
my $f2 = shift || "CSP8217.TXT"; 

open my $fh1, '>', 'file1'; 
open my $fh2, '>', 'file2'; 


open my $file1, '<', $f1; 
while (my $line = <$file1>) { 
    my $sbs1 = substr($line, 0, 10); 
    $results{$sbs1} = 1 
} 

open my $file2, '<', $f2; 
while (my $line = <$file2>) { 
    my $sbs2 = substr($line, 0, 10); 
    if (!$results{$sbs2}) { 
     $results{$sbs2} = 1; 
    } 
    $results{$sbs2}++ 
} 

foreach my $line (sort { $results{$b} <=> $results{$a} } keys %results) { 
    if ($results{$line} > 1) { 
     print {$fh1} "$line"; 
    } 
    else { 
     print {$fh2} "$line"; 
    } 
}