Сравнение Perl-файлов и запись значений - PullRequest
0 голосов
/ 15 ноября 2011

У меня есть 2 файла. Я хочу сравнить значения в file1 с file2 и заменить значение file1, если обнаружено, что значение отличается от file2.

Если есть какие-либо дополнительные значения вfile2 тогда его можно игнорировать.

file1:

value1 equalto txt

value2 equalto doc 

value3 equalto new  

file2:

value1 equalto   doc   

value2 equalto   ref                       replace this value in  file1

value3 equalto  txt                       replace this value in  file1

value4 equalto  test                      ignore this if not found in file1

Ответы [ 2 ]

0 голосов
/ 15 ноября 2011

Это должно сработать:

#!/usr/bin/perl

use strict;
use warnings;

my ($to_change, $reference) = @ARGV[0,1];
my %pairs_ref;
my %pairs_change;
my $line = qr/^(\w+)\s+equalto\s+(\w+)/;

# read the reference file
open (my $fhr, '<', $reference) or die "Cannot read from file $reference: $!";
while (<$fhr>) {
   if (/$line/) {
      my ($param, $value) = ($1, $2);
      $pairs_ref{$param} = $value;  # store all pairs
   }
}
close $fhr;

# read the file to be modified (note: we're not using in-place modification!)
open (my $fhc, '<', $to_change) or die "Cannot read from file $to_change: $!";
while (<$fhc>) {
   if (/$line/) {
      my $param = $1;
      # if the parameter appeared in the reference file, set the value to the reference
      # value (does no damage if they're identical anyway)
      if (defined $pairs_ref{$param}) {
         $pairs_change{$param} = $pairs_ref{$param}; 
      }
   }
}
close $fhc;

# print to the output file (that way we're not overwriting the original information)
open (my $fhn, '>', "file3") or die "Cannot write to file3: $!";
foreach my $param (sort keys %pairs_change) {
   print $fhn "$param equalto $pairs_change{$param}\n\n";
}
close $fhn;

Это просто, и я использовал только ту информацию, которая была дана в вашем вопросе, поэтому я не знаю, действительно ли это то, что вы ищете,Я не учел никаких различий в количестве пробелов или около того.

Полученный файл (который я назвал 'file3') выглядит так:

value1 equalto doc

value2 equalto ref

value3 equalto txt

Сценарийбыть вызванным так:

./script.pl file1 file2
0 голосов
/ 15 ноября 2011
#!/usr/bin/env perl
use strict;
use warnings;
my $ pass = 0;
my ( $first, $rest, %hash_of_lines );
while (<>) {
    chomp;
    ( $first, $rest ) = split / /, $_, 2;
    if ($pass == 0) {
        $hash_of_lines{$first} = $_;
    }
    elsif ( exists $hash_of_lines{$first} ) {
        $hash_of_lines{$first} = $_;
    }
    $pass++ if eof;
}
for my $key (sort keys %hash_of_lines) {
    print $hash_of_lines{$key}, "\n";
}
1;

Используйте это как:

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