Perl(比较两个文件)仅在主文件上打印出差异
Perl (compare two file) print out differences on main file only
我有两个文件需要比较并打印出在第一个密钥文件中发现的差异。文件一是密钥文件包含客户phone号码,文件字母表示类型是C-CELLPHONE或H-HOMEPHONE。第一个字母无关紧要。
C2817771111 MARY LEE
C8328883333 JOSEPH NGO
C2012122111 PETER LANDRY
C2123461111 PETER JAMES
C2531861212 DAMARIS PAUL
H8329195253 TIMOTHY HUE
第二个文件有更多的列但是文件的两列是相同的
C8328883333 JOSEPH NGO ADDRESS CITY STATE COUNTRY
C2012122111 PETER LANDRY ADDRESS CITY STATE COUNTRY
C2123461111 PETER JAMES ADDRESS CITY STATE COUNTRY
#! /usr/bin/env perl
my %custphonehash = ();
$cellphone = "<cellphone.dat";
open (HOMEPHONES,"<homephone.txt");
open(CELLPHONES,$cellphone);
open(DELTA_RECORDS,">delta_phones.txt");
while(<CELLPHONES>){
chomp($cellphone = $_);
$custouthash{$cellphone} = substr($cellphone,1,10);
}
while(<HOMEPHONES>) {
chomp($line = $_);
$phone_no = ($line,1,10)
if ( exists $custphonehash{$phone_no}
{
print DELTA_RECORDS "$_\n" ;
}
}
close CELLPHONES;
close HOMEPHONES;
close DELTA_RECORDS;*
输出应该是这样的:
C2531861212 DAMARIS PAUL
H8329195253 TIMOTHY HUE
我会为第二个文件中的项目创建一个散列 table,然后您可以遍历第一个文件并检查该数字是否存在,以及名称是否与该数字匹配。
给定的 FILE1 如下所示
C2817771111 MARY LEE
C8328883333 JOSEPH NGO
C2012122111 PETER LANDRY
C2123461111 PETER JAMES
C2531861212 DAMARIS PAUL
H8329195253 TIMOTHY HUE
FILE2 看起来像这样
C8328883333 JOSEPH NGO ADDRESS CITY STATE COUNTRY
C2012122111 PETER LANDRY ADDRESS CITY STATE COUNTRY
C2123461111 PETER JAMES ADDRESS CITY STATE COUNTRY
脚本看起来像这样
use strict;
use warnings;
my $regex = qr/[CH](\d+) +(\w+ +\w+) *.*/;
my %hash;
while (<FILE2>) {
my ($num, $name) = $_ =~ $regex;
$hash{$num} = "$name";
}
while (<FILE1>) {
my ($num, $name) = $_ =~ $regex;
print unless (exists $hash{$num} and $hash{$num} = $name)
}
我得到以下输出
C2817771111 MARY LEE
C2531861212 DAMARIS PAUL
H8329195253 TIMOTHY HUE
养成始终使用 strict
和 warnings
编译指示的习惯,因为它们有助于正确确定代码范围并发现错误。
此外,当前打开文件的习惯用法是使用词法文件句柄,带有三个参数,就像这样...
open my $homephone, '<', 'homephone.txt';
while (<$homephone>) {
# do stuff
}
close $homephone
我有两个文件需要比较并打印出在第一个密钥文件中发现的差异。文件一是密钥文件包含客户phone号码,文件字母表示类型是C-CELLPHONE或H-HOMEPHONE。第一个字母无关紧要。
C2817771111 MARY LEE
C8328883333 JOSEPH NGO
C2012122111 PETER LANDRY
C2123461111 PETER JAMES
C2531861212 DAMARIS PAUL
H8329195253 TIMOTHY HUE
第二个文件有更多的列但是文件的两列是相同的
C8328883333 JOSEPH NGO ADDRESS CITY STATE COUNTRY
C2012122111 PETER LANDRY ADDRESS CITY STATE COUNTRY
C2123461111 PETER JAMES ADDRESS CITY STATE COUNTRY
#! /usr/bin/env perl
my %custphonehash = ();
$cellphone = "<cellphone.dat";
open (HOMEPHONES,"<homephone.txt");
open(CELLPHONES,$cellphone);
open(DELTA_RECORDS,">delta_phones.txt");
while(<CELLPHONES>){
chomp($cellphone = $_);
$custouthash{$cellphone} = substr($cellphone,1,10);
}
while(<HOMEPHONES>) {
chomp($line = $_);
$phone_no = ($line,1,10)
if ( exists $custphonehash{$phone_no}
{
print DELTA_RECORDS "$_\n" ;
}
}
close CELLPHONES;
close HOMEPHONES;
close DELTA_RECORDS;*
输出应该是这样的:
C2531861212 DAMARIS PAUL
H8329195253 TIMOTHY HUE
我会为第二个文件中的项目创建一个散列 table,然后您可以遍历第一个文件并检查该数字是否存在,以及名称是否与该数字匹配。
给定的 FILE1 如下所示
C2817771111 MARY LEE
C8328883333 JOSEPH NGO
C2012122111 PETER LANDRY
C2123461111 PETER JAMES
C2531861212 DAMARIS PAUL
H8329195253 TIMOTHY HUE
FILE2 看起来像这样
C8328883333 JOSEPH NGO ADDRESS CITY STATE COUNTRY
C2012122111 PETER LANDRY ADDRESS CITY STATE COUNTRY
C2123461111 PETER JAMES ADDRESS CITY STATE COUNTRY
脚本看起来像这样
use strict;
use warnings;
my $regex = qr/[CH](\d+) +(\w+ +\w+) *.*/;
my %hash;
while (<FILE2>) {
my ($num, $name) = $_ =~ $regex;
$hash{$num} = "$name";
}
while (<FILE1>) {
my ($num, $name) = $_ =~ $regex;
print unless (exists $hash{$num} and $hash{$num} = $name)
}
我得到以下输出
C2817771111 MARY LEE
C2531861212 DAMARIS PAUL
H8329195253 TIMOTHY HUE
养成始终使用 strict
和 warnings
编译指示的习惯,因为它们有助于正确确定代码范围并发现错误。
此外,当前打开文件的习惯用法是使用词法文件句柄,带有三个参数,就像这样...
open my $homephone, '<', 'homephone.txt';
while (<$homephone>) {
# do stuff
}
close $homephone