每次脚本运行时perl都会增加计数器编号

时间:2011-07-28 18:43:20

标签: perl

我有一个脚本来比较2个文件并打印出文件中的匹配行。我想添加一个逻辑来帮助我确定这些设备的匹配时间。目前我已经添加了起点1,所以我希望每次脚本运行并匹配时都要增加该数字。

实施例

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

retiredDevice.txt

  

α

     

β

     

伽玛

     

德尔塔

prodDevice.txt

  

第一

     

第二

     

第三

     

所述

     

伽玛

     

德尔塔

输出文件: - #######################

final_result.txt

  

1 Delta

     

1 Gamma

我的目标是在每条匹配线上添加一个计数器标记,以确定“Delta”和“Gamma”匹配的时间。每周运行的脚本。所以每当脚本运行时添加1所以当我审核'finalResult.txt时。结果应该是

  

Delta 4

     

Gamma 3

结果表明我在过去4周内达到了匹配,而过去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 个答案:

答案 0 :(得分:1)

分两步执行此计算。

每次运行retired和prod之间的比较时,都会生成一个使用唯一文件名保存的输出文件,例如: result-XXX其中XXX表示您运行比较的时间。

然后编写一个脚本,迭代所有result-XXX文件并生成摘要。

我将文件命名为结果-YYYY-MM-DD,其中YYYY-MM-DD是创建比较的日期。然后迭代文件的子集(例如某个月的文件)将相对容易。

或将数据存储在关系数据库中。

答案 1 :(得分:1)

根据您之前的问题和评论,也许这可能有效。

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";
}