On Fri, Aug 29, 2008 at 5:10 PM, Pedro Soto <[EMAIL PROTECTED]> wrote:

> Hi,
> I am trying to write script to retrieve info from a file that looks like:
>
> col1   col2    col3
> A        5         10
> A        5         10
> A        5         11
> A        6          8
> A        7          9
> B        5          8
> B        6          9
> what i need is to get for each (non redundant) value from column 1, the
> corresponding non redundant values from column 2 and 3. e.g:
> For A (col 1), I want 5 -10, 5-11 and 6-8. For B: 5-8 and  6-9.
> I wrote a script to get rid of the redundant values using hashes and
> subroutines and it worked. However I still need to compare the elements
> from
> col2 and col3 with other values. To do this I want to sort the data, but I
> am struggling to sort the hash. It prints what I want but only if ask it to
> print within the subroutine (line 29). I do not know how to return a hash
> with the sorted values. I hope someone could help me out with this. The
> code
> is below:
>
>
> #! usr/local/bin/perl
>
>  use warnings;
>
>  use strict;
>
>  my %db_del;
>
>  my %std_dup;
>
>  open(IN,"file.csv") || die;
>
>     while (<IN>) {
>
>     my @temp=split/,/;
>
>     push (@{$db_del{$temp[0]}}, $temp[1]."\t".$temp[2]);
>
>                      }
>
>     &NONRE(%db_del,%std_dup);
>
>
>
> foreach my $e(%db_dup) {
>
> foreach my $l (@{$db_dup{$e}}) {
>
> print "$e,$l,$std_dup{$l}\n"; #does not print $std_dup{$l}
>
> }}
>
>
>
>  ########sub##############
>
> sub NONRE {
>
> my %hash;
>
> my %seen;
>
> my @uniq;
>
> my %st;
>
> %hash = @_;
>
> foreach my $k (sort keys%hash) {
>
>       foreach my $item(@{$hash{$k}}) {
>
>              push(@uniq,$item) unless $seen{$item}++;
>
>              }
>
>       foreach my $item(@uniq) {
>
>        my @stend =split/\t/,$item;
>
>        $st{$stend[0]}= $stend[1];
>
>               }
>
>        @{$hash{$k}}= sort {$a <=> $b} keys%st;
>
>       foreach my $f(keys%hash){
>
>       foreach my $l(@{$hash{$f}}) {
>
>       print "$f,$l,$st{$l} ok\n";# it prints OK
>
>                     }
>
>              }
>
> }
>
> @uniq =();
>
> %seen =();
>
> return(%hash,%st);
>
> }
>


My solution to do the same :-


*# cat l1.pl*
#! /usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my $gh;

open (PTR, "<redundant_values.txt") or die "Cannot open input file : $!";

my $str;
while ($str = <PTR>)
{
        chomp $str;

        $str =~ s/ +/ /g;

        my ($a, $b, $c) = split (/ /, $str);

#       $gh =
#               {
#                       1 => {1 => 2},
#                       a => {b => c},
#                       p => {q => r}
#               };
#
#       $gh->{'$a'}->${'$b'} = $c;

        print "==>$str\n";

        if (! exists ${gh}->{"$a"}->{"$b"})
        {
                ${gh}->{"$a"}->{"$b"} = $c;
                # ${${${gh}}{"$a"}}{"$b"} = $c;

                print Dumper($gh);
                # print Data::Dumper->Dump($gh);
        }
}

close (PTR);

print "Original File :-\n";

open (PTR, "<redundant_values.txt") or die "Cannot open input file : $!";

while ($str = <PTR>)
{
        chomp $str;

        print "$str\n";
}

close (PTR);

print "New File :-\n";

my ($a, $b);
while (($a, $b) = each (%{${gh}}))
{
        my ($c, $d);
        while (($c, $d) = each (%{${b}}))
        {
                print "$a,$c,$d\n";
        }
}

*#*




*# perl l1.pl*
==>A 5 1
$VAR1 = {
          'A' => {
                   '5' => '1'
                 }
        };
==>A 5 1
==>A 5 1
==>A 6 1
$VAR1 = {
          'A' => {
                   '6' => '1',
                   '5' => '1'
                 }
        };
==>A 7 2
$VAR1 = {
          'A' => {
                   '6' => '1',
                   '7' => '2',
                   '5' => '1'
                 }
        };
==>B 5 8
$VAR1 = {
          'A' => {
                   '6' => '1',
                   '7' => '2',
                   '5' => '1'
                 },
          'B' => {
                   '5' => '8'
                 }
        };
==>B 6 9
$VAR1 = {
          'A' => {
                   '6' => '1',
                   '7' => '2',
                   '5' => '1'
                 },
          'B' => {
                   '6' => '9',
                   '5' => '8'
                 }
        };
Original File :-
A        5         1
A        5         1
A        5         1
A        6         1
A        7         2
B        5         8
B        6         9
New File :-
A,6,1
A,7,2
A,5,1
B,6,9
B,5,8
*#*



Regards,
Amit Saxena

Reply via email to