in reply to Re^3: Load a file into hash with duplicate keys
in thread Load a file into hash with duplicate keys

As AnonymousMonk suggested, I used the second colum as the key.

#!/usr/bin/perl -w use Data::Dumper; my $data = '/Data/Table1.txt'; open INFILE, '<', $data or die "aa\n"; my %hash = map { chomp; split /\t/ } <INFILE>; print Dumper(\%hash); my $data2 = '/Data/Table2.txt'; open INFILE2, '<', $data2 or die "aa\n"; my %hash2; while(<INFILE2>) { chomp; my $line = $_; my $key = (split/\t/, $line)[0]; push @{ $hash2{$key} }, $line; } print Dumper(\%hash2);

This returns the following output

$VAR1 = { '218489_s_at' => 'NM_000031', '216064_s_at' => 'NM_000027', '218487_at' => 'NM_000031', '211110_s_at' => 'NM_000044', '204333_s_at' => 'NM_000027', '210632_s_at' => 'NM_000023', '203935_at' => 'NM_001111067', '211560_s_at' => 'NM_000032', '204332_s_at' => 'NM_000027', '215719_x_at' => 'NM_000043', '204780_s_at' => 'NM_000043', '202834_at' => 'NM_000029', '206121_at' => 'NM_000036', '204781_s_at' => 'NM_000043', '205412_at' => 'NM_000019', '216252_x_at' => 'NM_000043', '205216_s_at' => 'NM_000042', '211621_at' => 'NM_000044', '200710_at' => 'NM_000018', '202502_at' => 'NM_001127328' }; $VAR1 = { '211560_s_at' => [ '211560_s_at P P P + A P P P' ], '204332_s_at' => [ '204332_s_at P P A + P P P P' ], '216064_s_at' => [ '216064_s_at P M P + P P A A' ], '200005_at' => [ '200005_at P P A P + P P A' ], '211110_s_at' => [ '211110_s_at P A P + A P A P' ], '200003_s_at' => [ '200003_s_at P A P + P P A P' ] };

The first value elemant in the second hash includes the key.

Replies are listed 'Best First'.
Re^5: Load a file into hash with duplicate keys
by Anonymous Monk on Nov 02, 2010 at 21:02 UTC
    my $key = (split/\t/, $line)[0]; push @{ $hash2{$key} }, $line;
    Try this instead:

    my ($val, $key) = split /\t/, $line; push @{ $hash2{$key} }, $val;
      sorry, meant the other way round:

      my ($key, $val) = ...

      I think you meant this:

      my ($key, $val) = split /\t/, $line; push @{ $hash2{$key} }, $val;

      In this case, it only stores the first value.

      $VAR1 = { '211560_s_at' => [ 'P' ], '204332_s_at' => [ 'P' ], '216064_s_at' => [ 'P' ], '200005_at' => [ 'P' ], '211110_s_at' => [ 'P' ], '200003_s_at' => [ 'P' ] };
        ok, then try:

        my ($key, $val) = split /\t/, $line, 2;