Perl увеличивает число счетчиков при каждом запуске скрипта - PullRequest
1 голос
/ 28 июля 2011

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

Пример.

inputfile: - ########################

retiredDevice.txt

Альфа

Бета

Гамма

Дельта

prodDevice.txt

первый

второй

третий

вперед

Гамма

Дельта

выходной файл: - #######################

final_result.txt

1 Дельта

1 Гамма

Моя цель состоит в том, чтобы добавить встречную отметку на каждой соответствующей строке, чтобы определить, какдолго "дельта" и "гамма" совпали.скрипт работает каждую неделю.поэтому каждый раз, когда скрипт запускает добавление 1, когда я проверяю 'finalResult.txt.результат должен выглядеть следующим образом:

Delta 4

Gamma 3

результат показывает, что Delta соответствовала за последние 4 недели и Gamma за последние 3 недели.

#! /usr/local/bin/perl 
my $ndays = 1;
my $f1 = "/opt/retiredDevice.txt ";
my $f2 = "prodDevice.txt";
my $outfile = "/opt/final_result.txt";
my %results = ();

open FILE1, "$f1" or die "Could not open file: $! \n";
while(my $line = <FILE1>){   $results{$line}=1;
}
close(FILE1); 
open FILE2, "$f2" or die "Could not open file: $! \n";
while(my $line =<FILE2>) {  
$results{$line}++;
}
close(FILE2); 

open (OUTFILE, ">$outfile") or die "Cannot open $outfile for writing \n";
foreach my $line (keys %results) { 
my $x = $ndays;
$x++;
print OUTFILE "$x : ", $line if $results{$line} != 1;
}
close OUTFILE;

Заранее спасибо за любую помощь!

Ответы [ 2 ]

1 голос
/ 29 июля 2011

Выполните это вычисление в два этапа.

Каждый раз, когда вы запускаете сравнение между пенсионерами и prod, создайте выходной файл, который вы сохраняете с уникальным именем файла, например, result-XXX, где XXX обозначает, когда вы запустили сравнение.

Затем напишите скрипт, который перебирает все файлы результата XXX и выдает сводку.

Я бы назвал файл result-YYYY-MM-DD, где YYYY-MM-DD - это дата создания сравнения. Тогда будет относительно легко перебирать подмножество файлов (например, за определенный месяц).

Или сохранить данные в реляционной базе данных.

1 голос
/ 29 июля 2011

На основании ваших предыдущих вопросов и комментариев, возможно, это может сработать

use strict;
use warnings;
use autodie;

my $logfile = 'int.txt';
my $f1 = shift || "/opt/test.txt";
my $f2 = shift || "/opt/test1.txt";
my %results;
open my $file1, '<', $f1;
while (my $line = <$file1>) {
    chomp $line;
    $results{$line} = 1;
}
open my $file2, '<', $f2;
while (my $line = <$file2>) {
    chomp $line;
    $results{$line}++;
}

{ ############ added part
    my %c;
    for (keys %results) {
        $c{$_} = $results{$_} if $results{$_} > 1;
    }
    %results = %c;
} ############ end added part

my (%log, $log);
if ( -e $logfile ) {
    open $log, '<', $logfile;
    while (<$log>) {
        my ($num, $key) = split;
        $log{$key} = $num;
    }
}

open $log, '>', $logfile or die $!;
for my $key (keys %results) {
    my $old = ( $log{$key} || 0 ); # keep old count, or 0 otherwise
    my $new = ( $results{$key} ? 1 : 0 ); # 1 if it exists, 0 otherwise
    print $log $old + $new, " $key\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...