perl +比较两个文件之间的数字(NUM1和NUM2)

时间:2010-12-22 19:45:02

标签: perl

我需要比较file1到file2之间的chksum(NUM1和NUM2)(参见下面的示例)

  1. file1或file2中的第一个字段是文件路径
  2. file1或file2中的第二个字段是第一个chksum
  3. file1或file2中的第三个字段是第二个chksum
  4. 目标是从file1读取第一个字段(文件路径)并验证file2中是否存在此路径

    如果file2中存在文件路径,则需要比较file1到file2之间的chksum数字

    如果chksum相等则需要在equal.txt文件中写入文件路径+ chksum数字

    否则如果chksum不相等则需要在not_equal.txt文件中写入文件路径+ chksum数字

    • 备注(如果file2中的文件路径不存在于file2中则需要在not_exist.txt文件中写入文件路径)

    我需要对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
         .
         .
         .
         .
         .
    

2 个答案:

答案 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;