我寫了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";
}
}
這不工作,我有一種感覺它的一個問題邏輯,它只輸出一行中的子字符串。
如果相同的內容出現兩次按預期你的代碼不能正常工作在文件A或文件B中。解決方案是爲每個文件使用單獨的散列,然後檢查兩個散列中是否存在一行。 – pmakholm
'$ results {$ line}> = 1'應該是'$ results {$ line}> 1',否則(根據代碼)所有行在兩個文件中都是相同的。 –