| Author |
Choosing only numbers from the output
|
|
| Sudhindra K S 2004-08-04, 8:58 am |
| _
Hi
I have an output which looks like this:
Tag : Result
146603 :
147020 :
147155 : NONE
147160 :
147232 :
147243 :
147254 : none
147318 :
147341 : NONE
147430 : N/A
147708 :
147710 : 0000
147729 :
147768 :
147851 :
147921 :
147949 : 0000
147981 :
147983 :
147991 :
148007 : 0000
148080 :
148105:
148200 :
148312 : 38160
148329 : 44139
148444 :NONE
148514 :
148573 : 0000
148697 :
148759 :
148919 :
148920 :
148921 :
148923 :
148924 :
148933 :
148934 :
148935 :
148936 :
148937 :
148938 :
148939 :
148951 :
148996 :
Now i want to gather all the "Tags" for which the "Result" is a number (but shouldnt include the tag if the result is 0). The corresponding Result should go to another array.
Considering the above example my array1 should contain 148312 and 148329 and array2 should contain 38160 and 44139
How do i do this?
Thanks in advance
Regards
Sudhindra
| |
| Gunnar Hjalmarsson 2004-08-04, 8:58 am |
| Sudhindra K S wrote:
> I have an output which looks like this:
Do you possibly mean input? ;-)
> Tag : Result
> 148200 :
> 148312 : 38160
> 148329 : 44139
> 148444 : NONE
> 148514 :
> 148573 : 0000
> 148697 :
<similar lines snipped>
> Now i want to gather all the "Tags" for which the "Result" is a
> number (but shouldnt include the tag if the result is 0). The
> corresponding Result should go to another array.
>
> Considering the above example my array1 should contain 148312 and
> 148329 and array2 should contain 38160 and 44139
>
> How do i do this?
while (<DATA> ) {
my ($tag, $result) = split /[ :]+/;
if ($result =~ /^\d+$/ and $result > 0) {
...
--
Gunnar Hjalmarsson
Email: http://www.gunnar.cc/cgi-bin/contact.pl
| |
| John W. Krahn 2004-08-04, 8:58 am |
| -----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
sudhindra k s wrote:
|
| Hi
Hello,
| I have an output which looks like this:
|
| Tag : Result
| 146603 :
| 147020 :
| 147155 : NONE
| 147160 :
| 147232 :
| 147243 :
| 147254 : none
| 147318 :
| 147341 : NONE
| 147430 : N/A
| 147708 :
| 147710 : 0000
| 147729 :
| 147768 :
| 147851 :
| 147921 :
| 147949 : 0000
| 147981 :
| 147983 :
| 147991 :
| 148007 : 0000
| 148080 :
| 148105 :
| 148200 :
| 148312 : 38160
| 148329 : 44139
| 148444 : NONE
| 148514 :
| 148573 : 0000
| 148697 :
| 148759 :
| 148919 :
| 148920 :
| 148921 :
| 148923 :
| 148924 :
| 148933 :
| 148934 :
| 148935 :
| 148936 :
| 148937 :
| 148938 :
| 148939 :
| 148951 :
| 148996 :
|
| Now i want to gather all the "Tags" for which the "Result" is a number (but shouldnt include the tag if the result is 0). The corresponding Result should go to another array.
|
| Considering the above example my array1 should contain 148312 and 148329 and array2 should contain 38160 and 44139
|
| How do i do this?
I would use an array of arrays or an array of hashes instead of two
separate arrays.
my @tag_and_results;
while ( <FILE> ) {
~ next unless /^(\d+)\D+([1-9]\d*)/;
~ push @tag_and_results, [ $1, $2 ];
~ }
John
- --
use Perl;
program
fulfillment
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.4 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
iD8DBQFBEMgW5dGfmBZ1ssARAmiKAJ43Qy6ysZoU
R/GURjurXf4FMlVNCACfSn/J
VQZ4Wxrgr9T6J7zbLXJDOPM=
=C2SM
-----END PGP SIGNATURE-----
| |
| Ronald Yacketta 2004-08-04, 8:58 am |
| One way would be to split each line using : as the delimiter..
I am sure there are others, but I think split would be the easiest... IMHO
From: sudhindra k s
Sent: Wed 8/4/2004 5:48 AM
To: beginners@perl.org
Subject: Choosing only numbers from the output
Hi
I have an output which looks like this:
Tag : Result
146603 :
147020 :
147155 : NONE
147160 :
147232 :
147243 :
147254 : none
147318 :
147341 : NONE
147430 : N/A
147708 :
147710 : 0000
147729 :
147768 :
147851 :
147921 :
147949 : 0000
147981 :
147983 :
147991 :
148007 : 0000
148080 :
148105 :
148200 :
148312 : 38160
148329 : 44139
148444 : NONE
148514 :
148573 : 0000
148697 :
148759 :
148919 :
148920 :
148921 :
148923 :
148924 :
148933 :
148934 :
148935 :
148936 :
148937 :
148938 :
148939 :
148951 :
148996 :
Now i want to gather all the "Tags" for which the "Result" is a number (butshouldnt include the tag if the result is 0). The corresponding Result should go to another array.
Considering the above example my array1 should contain 148312 and 148329 and array2 should contain 38160 and 44139
How do i do this?
Thanks in advance
Regards
Sudhindra
| |
| Zeus Odin 2004-08-04, 3:56 pm |
| I think a hash is more apt for this problem, but changing to (an) array(s)
is not difficult at all.
The data as posted had white space trailing some of the digits after the
colons. I found this worked better for me. Your results may vary.
;-)
#!/usr/bin/perl
use warnings;
use strict;
my %tag;
while (<DATA> ) {
/^(\d+)\s*:\s*(\d+)/ or next;
$tag { $1 } = $2 unless $2 =~ /^0+$/;
}
while ( my($k, $v) = each %tag ) { print "$k ==> $v\n"; }
__DATA__
146603 :
147020 :
147155 : NONE
..
..
..
"Gunnar Hjalmarsson" <noreply@gunnar.cc> wrote in message
news:20040804101403.16584.qmail@onion.perl.org...
> while (<DATA> ) {
> my ($tag, $result) = split /[ :]+/;
> if ($result =~ /^\d+$/ and $result > 0) {
> ...
| |
| Gunnar Hjalmarsson 2004-08-04, 8:55 pm |
| Zeus Odin wrote:
> Gunnar Hjalmarsson wrote:
>
> The data as posted had white space trailing some of the digits
> after the colons.
Yes, but how would that matter? Please read the second sentence in
"perldoc -f split".
--
Gunnar Hjalmarsson
Email: http://www.gunnar.cc/cgi-bin/contact.pl
| |
| Zeus Odin 2004-08-04, 8:55 pm |
| You are correct. I did not properly look at the regex you passed to split.
"Gunnar Hjalmarsson" <noreply@gunnar.cc> wrote
>
> Yes, but how would that matter? Please read the second sentence in
> "perldoc -f split".
| |
| Christopher J. Bottaro 2004-08-04, 8:55 pm |
| this is an interesting question in that its not about syntax or a specific
problem in perl.
here's the algorithm:
while there are lines to read from the input
read a line
split the line into two seperate strings around the colon
if both strings are numbers
append the first string into array1
append the second string into array2
that is "how you do this", or at least one way...=)
sudhindra k s wrote:
>
> Hi
>
> I have an output which looks like this:
>
> Tag : Result
> 146603 :
> 147020 :
> 147155 : NONE
> 147160 :
> 147232 :
> 147243 :
> 147254 : none
> 147318 :
> 147341 : NONE
> 147430 : N/A
> 147708 :
> 147710 : 0000
> 147729 :
> 147768 :
> 147851 :
> 147921 :
> 147949 : 0000
> 147981 :
> 147983 :
> 147991 :
> 148007 : 0000
> 148080 :
> 148105 :
> 148200 :
> 148312 : 38160
> 148329 : 44139
> 148444 : NONE
> 148514 :
> 148573 : 0000
> 148697 :
> 148759 :
> 148919 :
> 148920 :
> 148921 :
> 148923 :
> 148924 :
> 148933 :
> 148934 :
> 148935 :
> 148936 :
> 148937 :
> 148938 :
> 148939 :
> 148951 :
> 148996 :
>
> Now i want to gather all the "Tags" for which the "Result" is a number
> (but shouldnt include the tag if the result is 0). The corresponding
> Result should go to another array.
>
> Considering the above example my array1 should contain 148312 and 148329
> and array2 should contain 38160 and 44139
>
> How do i do this?
>
> Thanks in advance
>
> Regards
> Sudhindra
|
|
|
|