2010-12-22 4 views
0

je dois comparer chksum (NUM1 et NUM2) entre fichier1 fichier2 (voir exemple ci-dessous vers le bas)perl + comparer les numéros (num1 et NUM2) entre deux fichiers

  1. Le premier champ fichier1 ou fichier2 est le chemin de fichier
  2. le second champ dans fichier_1 ou file2 est le premier chksum
  3. le troisième champ dans fichier_1 ou file2 est le deuxième chksum

l'objectif consiste à lire à partir de fichier_1 le premier champ (chemin d'accès de fichier) et pour vérifier si ce chemin existe dans fichier2

Si le chemin du fichier existe dans fichier2 besoin alors de comparer les numéros de chksum entre fichier1 fichier2

Si chksum égale besoin d'écrire le chemin du fichier + numéros chksum dans le fichier equal.txt

autre si chksum pas égal alors besoin d'écrire le chemin du fichier + numéros de chksum dans le fichier not_equal.txt

  • remarque (si le chemin du fichier de fichier1 existe pas dans fichier2 alors besoin d'écrire le chemin du fichier dans not_exist.txt fichier)

je dois le faire pour tous les chemins de fichiers fichier1 jusqu'à EOF

Question: Quelqu'un peut-il avoir le script intelligent perl pour cela?

Fichier1

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

Fichier2

                 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

Quel est le plus gros fichier? –

+0

ce n'est pas important (besoin de comparer chksum entre fichier1 à fichier2) – jon

Répondre

0

Pour chaque fichier, créez un Hashtable où la clé est le nom du fichier et la valeur est la somme de contrôle. Effectuez une itération sur les noms de fichiers du premier fichier (foreach $file (keys %hash_from_file1)) et vérifiez si ce nom de fichier existe dans le hachage du deuxième fichier. Si c'est le cas, vérifiez que les valeurs des deux tables de hachage sont les mêmes ($hash_from_file1{$file} eq $hash_from_file2{$file}). Si ceux-ci correspondent, alors écrivez le fichier et sa valeur de hachage à equal.txt. Sinon, écrivez le fichier et la valeur de hachage à not_equal.txt.

Est-il possible qu'il y ait une entrée dans le second fichier qui n'existerait pas dans le premier fichier?

+0

règle si fichier2 a un chemin de fichier qui n'existe pas dans fichier1 alors c'est ok (besoin d'ignorer ce cas) – jon

0

La solution de mobrule est correcte. Ceci est le code:

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

Vous devriez vraiment utiliser des gestionnaires de fichiers lexicaux, 3 args ouverts et test d'échec lors de l'ouverture d'un fichier. – Toto

Questions connexes