【问题标题】:perl + compare numbers (NUM1 and NUM2) between two filesperl + 比较两个文件之间的数字(NUM1 和 NUM2)
【发布时间】:2010-12-23 13:25:18
【问题描述】:

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

  1. file1 或 file2 中的第一个字段是文件路径
  2. file1 或 file2 中的第二个字段是第一个 chksum
  3. file1 或 file2 中的第三个字段是第二个校验和

目标是从file1中读取第一个字段(文件路径),并验证该路径是否存在于file2中

如果file2中存在文件路径,则需要比较file1和file2之间的校验和数

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

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

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

我需要对 file1 中的所有文件路径执行此操作,直到 EOF

问题:有人可以为此提供智能 perl 脚本吗?

文件1

                                                                     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
     .
     .
     .
     .
     .

【问题讨论】:

  • 它不重要(需要比较file1和file2之间的chksum)

标签: perl


【解决方案1】:

为每个文件创建一个哈希表,其中键是文件名,值是校验和。 遍历第一个文件 (foreach $file (keys %hash_from_file1)) 中的文件名,并检查该文件名是否存在于第二个文件的哈希中。如果是,请检查两个哈希表的值是否相同 ($hash_from_file1{$file} eq $hash_from_file2{$file})。如果匹配,则将文件及其哈希值写入equal.txt。如果没有,将文件和哈希值写入not_equal.txt

是否有可能在第二个文件中存在第一个文件中不存在的条目?

【讨论】:

  • 规则如果file2的文件路径在file1中不存在,那么它就可以(需要忽略这种情况)
【解决方案2】:

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;

【讨论】:

  • 您确实应该使用词法文件处理程序,打开 3 个 args 并在打开文件时测试是否失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-12
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
相关资源
最近更新 更多