使用perl比较两个文件时出现问题

时间:2014-04-18 06:35:02

标签: perl

我有一个文件soa.csv

/net/slc06wmg/scratch/aime1/work/IDM/BASEDIR/IDMTOP/products/app/soa/diagnostics/config,0750
/net/slc06wmg/scratch/aime1/work/IDM/BASEDIR/IDMTOP/products/app/soa/diagnostics/config/registration,0750
/net/slc06wmg/scratch/aime1/work/IDM/BASEDIR/IDMTOP/products/app/soa/modules/oracle.uix_11.1.1/uix2.jar,0640

还有另一个文件soa2.csv

/net/slc06wmg/scratch/aime1/work/IDM/BASEDIR/IDMTOP/products/app/soa/diagnostics/config/registration,0740
/net/slc06wmg/scratch/aime1/work/IDM/BASEDIR/IDMTOP/products/app/soa/diagnostics/config/registration/OUI.xml,0740
/net/slc06wmg/scratch/aime1/work/IDM/BASEDIR/IDMTOP/products/app/soa/modules/oracle.uix_11.1.1,0750
/net/slc06wmg/scratch/aime1/work/IDM/BASEDIR/IDMTOP/products/app/soa/modules/oracle.uix_11.1.1/uix2.jar,0640
/net/slc06wmg/scratch/aime1/work/IDM/BASEDIR/IDMTOP/products/app/soa/modules/oracle.uix_11.1.1/uix3.jar,0640

我想比较这两个文件。 为此,我将两个文件的内容推送到两个单独的哈希中。 这样,key是filePath,value是csv中逗号后的文件权限。

我的算法是,如果hash1中存在hash1的键,则比较该值。如果不同,则将其打印在文件中。

$changedPermissions="FilesWithChangedPermissions.dif";
 unless(open FH3, '>>'.$changedPermissions) {
       die "Unable to create $changedPermissions";
}
foreach my $key2 ( keys %hash2 ) {
    next unless ( exists $hash1{$key2} );
    my $val1 = join(",", sort @{ $hash1{$key2} });
    my $val2 = join(",", sort @{ $hash2{$key2} });
    if ($val1 eq $val2) {
       print FH4 "$key2";
    }
    else {
        print FH3 "$key2 $val1 $val2\n";
    }
}  

请注意我正在使用join,因为将来csv文件可能包含其他属性,如文件大小等。 FilesWithChangedPermissions.dif的内容是:

/net/slc06wmg/scratch/aime1/work/IDM/BASEDIR/IDMTOP/products/app/soa/modules/oracle.uix_11.1.1/uix2tags.jar 0640 0640
/net/slc06wmg/scratch/aime1/work/IDM/BASEDIR/IDMTOP/products/app/soa/diagnostics/config/registration/OUI.xml 0740 0740
/net/slc06wmg/scratch/aime1/work/IDM/BASEDIR/IDMTOP/products/app/soa/modules/oracle.uix_11.1.1/uix11.war 0640 0640
/net/slc06wmg/scratch/aime1/work/IDM/BASEDIR/IDMTOP/products/app/soa/modules/oracle.uix_11.1.1/uix2-install.zip 0640 0640
/net/slc06wmg/scratch/aime1/work/IDM/BASEDIR/IDMTOP/products/app/soa/modules/oracle.uix_11.1.1 0750 0750
/net/slc06wmg/scratch/aime1/work/IDM/BASEDIR/IDMTOP/products/app/soa/modules/oracle.uix_11.1.1/uixadfrt.jar 0640 0640
/net/slc06wmg/scratch/aime1/work/IDM/BASEDIR/IDMTOP/products/app/soa/modules/oracle.uix_11.1.1/uix2.jar 0640 0640
/net/slc06wmg/scratch/aime1/work/IDM/BASEDIR/IDMTOP/products/app/soa/diagnostics/config/registration 0750 0740
/net/slc06wmg/scratch/aime1/work/IDM/BASEDIR/IDMTOP/products/app/soa/modules/oracle.uix_11.1.1/uix2.jar 0640 0640
/net/slc06wmg/scratch/aime1/work/IDM/BASEDIR/IDMTOP/products/app/soa/diagnostics/config/registration 0750 0740

因此,具有相同文件权限的文件也会在输出中打印错误。

请帮助..我是perl的新手..任何帮助将不胜感激!!

1 个答案:

答案 0 :(得分:0)

在应用之前,使用标准Linux工具包更容易:commsort内容的soa.csv和soa2.csv文件。

comm -23 soa.csv soa2.csv - 获取仅出现在第一个文件中的行。

comm -13 soa.csv soa2.csv - 获取仅显示在第二个文件中的行。

comm -12 soa.csv soa2.csv - 获取显示在两个文件中的行。