开发者

perl increasing the counter number every time the script running

I have a script to compare 2 files and print out the matching lines on the file. what I want to add a logic to help me to identify for how long these devices are matched. currently I have add the starting point 1 so I want to increase that number every time the script run and matched.

Example.

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

retiredDevice.txt

Alpha

Beta

Gamma

Delta

prodDevice.txt

first

second

third

forth

Gamma

Delta

output file :-#######################

final_result.txt

1 Delta

1 Gamma

my objective is to add a counter stamp on each matching line to identify for how long "Delta" and "Gamma" matched. the script running every week. so every time the script running adding 1 so when I audit the 'finalResult.txt. the result should looks like

Delta 4

Gamma 3

the result indicate me Delta matched for last 4 weeks and Gamma for last 3 weeks.

#! /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开发者_如何学C "$x : ", $line if $results{$line} != 1;
}
close OUTFILE;

Thanks in advance for any help!


Based on your earlier question and comments, perhaps this might work.

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


Perform this computation in two steps.

Each time you run the comparison between retired and prod, produce an output file that you save with a unique file name, e.g. result-XXX where XXX denotes when you ran the comparison.

Then write a script which iterates over all of the result-XXX files and produces a summary.

I would name the files result-YYYY-MM-DD where YYYY-MM-DD is the date that the comparison was created. Then it will be relatively easy to iterate over a subset of the files (e.g. ones for a certain month).

Or store the data in a relational database.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜