我有一个文件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的新手..任何帮助将不胜感激!!
答案 0 :(得分:0)
在应用之前,使用标准Linux工具包更容易:comm
和sort
内容的soa.csv和soa2.csv文件。
comm -23 soa.csv soa2.csv
- 获取仅出现在第一个文件中的行。
comm -13 soa.csv soa2.csv
- 获取仅显示在第二个文件中的行。
comm -12 soa.csv soa2.csv
- 获取显示在两个文件中的行。