$ cat spw663850.dat
total Laptops produced: 60
total cpu sold: 57
total mice produced: 40
total cpu sold: 45
total Laptops produced: 68
total mice produced: 48
total cpu sold: 51
total printers produced: 19
total monitors produced: 149
$
$
$ cat spw663850
#!/usr/bin/perl
#
use strict;
use warnings;
use List::Util q{first};
my ( $inFile, @phrases ) = @ARGV;
my $lastPhrase = $phrases[ -1 ];
open my $inFH, q{<}, $inFile
or die qq{open: $inFile: $!\n};
my @lines = <$inFH>;
close $inFH or die qq{close: $!\n};
foreach my $phrase ( @phrases )
{
my $rxPhrase = qr{\Q$phrase\E};
my $lineNo =
first { $lines[ $_ ] =~ $rxPhrase } 0 .. $#lines;
unless ( defined $lineNo )
{
print qq{$phrase: not found in sequence\n};
next;
}
print qq{$1\n}
if $lines[ $lineNo ] =~ m{\Q$lastPhrase\E\s*(\d+)};
$lineNo ++;
splice @lines, 0, $lineNo;
}
$
$
$ ./spw663850 spw663850.dat 'total Lap tops produced:' 'total mice pro
+duced:' 'total cpu sold:'
45
$
Feel free to ask if the script is not clear. I cleaned up the data file so that none of the lines had spaced before the colons just for consistency. Cheers,
JohnGG | [reply] [d/l] |
John ur a genius ... ill let u know after running....
thanks,
Mercury
| [reply] |
test.txt
total Laptops produced: 60
total cpu sold: 57
total mice produced: 40
total cpu sold: 45
total Laptops produced: 68
total mice produced: 48
total cpu sold: 51
total printers produced: 19
total monitors produced: 149
76 wireless cards produced
#!/usr/bin/perl
#
use strict;
use warnings;
use List::Util q{first};
sub search_phrase{
my ( $inFile, @phrases ) = @_;
my $lastPhrase = $phrases[ -1 ];
open my $inFH, q{<}, $inFile
or die qq{open: $inFile: $!\n};
my @lines = <$inFH>;
close $inFH or die qq{close: $!\n};
foreach my $phrase ( @phrases )
{
my $rxPhrase = qr{\Q$phrase\E};
my $lineNo =
first { $lines[ $_ ] =~ $rxPhrase } 0 .. $#lines;
unless ( defined $lineNo )
{
print qq{$phrase: not found in sequence\n};
next;
}
print qq{$1\n}
if $lines[ $lineNo ] =~ m{\Q$lastPhrase\E\s*(\d+)};
$lineNo ++;
splice @lines, 0, $lineNo;
}
}
$file_n = "test.txt";
$phrase1 = "total Laptops produced:";
$phrase2 = "total monitors produced:";
$phrase3 = "total cpu sold:";
&search_phrase($file_n, $phrase1, $phrase2, $phrase3);
the scripts works great....
i have changed this as a function
but a few more additions John
i have updated a line in test.txt
1. the return number which we want could be even at the beginning of the line also.
2. If the last phrase is not found it has to return -1 as the value
3. one more thing is if the same phrase is passed twice, it has return the last phrase's value.
For eg.
$phrase1 = "total cpu sold:";
$phrase2 = "total mice produced:";
$phrase3 = "total cpu sold:";
phrase3 's value has to be returned not both...
for example in our file
45 is to be returned, not both (57 and 45)
3. Could u add some comments if possible, to make it clear.
thanks a lot,
Mercury.
| [reply] [d/l] |
| [reply] [d/l] [select] |