Perl + сравнить числа (NUM1 и NUM2) между двумя файлами - PullRequest
0 голосов
/ 22 декабря 2010

Мне нужно сравнить chksum (NUM1 и NUM2) между file1 и file2 (см. Пример ниже)

  1. Первое поле в файле1 или файле2 - это путь к файлу
  2. Второе поле в файле1 или файле2 - это первая chksum
  3. Третье поле в file1 или file2 - это вторая chksum

Цель - прочитать из файла1 первое поле (путь к файлу) и проверить, существует ли этот путь в файле2

Если путь к файлу существует в файле2, необходимо сравнить числа chksum между файлом1 и файлом2

Если chksum равен, то нужно записать путь к файлу + числа chksum в файле equal.txt

иначе, если chksum не равен, нужно записать путь к файлу + номера chksum в файле not_equal.txt

  • примечание (если путь к файлу из файла1 не существует в файле2, необходимо записать путь к файлу в файле 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
   .
   .
   .

File2

                                                                        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 голосов
/ 23 декабря 2010

Мобруле решение правильно. Это код:

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;
0 голосов
/ 22 декабря 2010

Для каждого файла создайте хеш-таблицу, где ключ - это имя файла, а значение - контрольная сумма. Выполните итерацию по именам файлов из первого файла (foreach $file (keys %hash_from_file1)) и проверьте, существует ли это имя файла в хэше из второго файла. Если это так, убедитесь, что значения двух хеш-таблиц совпадают ($hash_from_file1{$file} eq $hash_from_file2{$file}). Если они совпадают, запишите файл и его хеш-значение в equal.txt. Если нет, запишите файл и значение хэша в not_equal.txt.

Возможно ли, чтобы во втором файле была запись, которой не было бы в первом файле?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...