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

养成始终使用 strictwarnings 编译指示的习惯,因为它们有助于正确确定代码范围并发现错误。

此外,当前打开文件的习惯用法是使用词法文件句柄,带有三个参数,就像这样...

open my $homephone, '<', 'homephone.txt';
while (<$homephone>) {
    # do stuff
}
close $homephone