我需要比较file1到file2之间的chksum(NUM1和NUM2)(参见下面的示例)
目标是从file1读取第一个字段(文件路径)并验证file2中是否存在此路径
如果file2中存在文件路径,则需要比较file1到file2之间的chksum数字
如果chksum相等则需要在equal.txt文件中写入文件路径+ chksum数字
否则如果chksum不相等则需要在not_equal.txt文件中写入文件路径+ chksum数字
我需要对file1中的所有文件路径执行此操作,直到EOF
问题:有人可以使用智能perl脚本吗?
File1中
NUM1 NUM2
/lib/modules/2.6.18-128.el5PAE/kernel/drivers/block/cpqarray.ko 1317610 32
/lib/modules/2.6.18-128.el5PAE/kernel/drivers/block/cryptoloop.ko 320619 9
/lib/modules/2.6.18-128.el5PAE/kernel/drivers/block/DAC960.ko 20639107 6
/lib/modules/2.6.18-128.el5PAE/kernel/drivers/block/floppy.ko 9547813 71
/lib/modules/2.6.18-128.el5PAE/kernel/drivers/block/loop.ko 2083034 23
/lib/modules/2.6.18-128.el5PAE/kernel/drivers/block/nbd.ko 6470230 18
/data/libc-2.5.so 55861 1574
/bin/libcap.so.1.10 03221 12
/var/libcidn-2.5.so 31744 188
/etc/libcom_err.so.2.1 40247 8
.
.
.
文件2
NUM1 MUM2
/lib/modules/2.6.18-128.el5PAE/kernel/drivers/block/cpqarray.ko 541761 232
/lib/modules/2.6.18-128.el5PAE/kernel/drivers/block/cryptoloop.ko 224619 9
/lib/modules/2.6.18-128.el5PAE/kernel/drivers/block/DAC960.ko 06391 73
/lib/modules/2.6.18-128.el5PAE/kernel/drivers/block/floppy.ko 54081 71
/lib/modules/2.6.18-128.el5PAE/kernel/drivers/block/loop.ko 08307 23
/lib/modules/2.6.18-128.el5PAE/kernel/drivers/block/nbd.ko 470275 58
.
.
.
.
.
答案 0 :(得分:0)
对于每个文件,创建一个哈希表,其中键是文件名,值是校验和。
迭代第一个文件(foreach $file (keys %hash_from_file1)
)中的文件名,并检查该文件名是否存在于第二个文件的哈希中。如果是,请检查两个哈希表的值是否相同($hash_from_file1{$file} eq $hash_from_file2{$file}
)。如果这些匹配,则将文件及其哈希值写入equal.txt
。如果没有,请将文件和哈希值写入not_equal.txt
。
第二个文件中是否有可能存在第一个文件中不存在的条目?
答案 1 :(得分:0)
mobrule的解决方案是正确的。 这是代码:
use strict;
use warnings;
open FIN, "file2";
my $file2_hash = {};
while (<FIN> =~/^(.*?)\s*(\d+)\s*(\d+)$/) {
$file2_hash->{$1} = "$2_$3";
}
close FIN;
open FIN, "file1";
open EQUAL, ">equal.txt";
open NOT_EQUAL, ">not_equal.txt";
open NOT_EXIST, ">not_exist.txt";
while (<FIN> =~/^(.*?)\s*(\d+)\s*(\d+)$/) {
my $output_str = "$1\t$2\t$3\n";
if (not exists $file2_hash->{$1}) {
print NOT_EXIST $output_str;
} elsif ($file2_hash->{$1} ne "$2_$3") {
print NOT_EQUAL $output_str;
} else {
print EQUAL $output_str;
}
}
close FIN;
close EQUAL;
close NOT_EQUAL;
close NOT_EXIST;