【发布时间】:2016-06-16 10:29:36
【问题描述】:
我编写了 thsi 脚本来比较两个文件的行,并将公共/非公共行输出到两个不同的文件中。脚本是:
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 中出现两次,则您的代码无法按预期工作。解决方案是为每个文件使用单独的哈希,然后检查两个哈希中是否存在一行。
-
$results{$line} >= 1应该是$results{$line} > 1,否则(根据代码)两个文件中的所有行都相同。
标签: perl file compare substring