%col2 = (); %col3 = (); %col4 = (); $input = @ARGV[0]; open (INP , "$input"); foreach () { chomp; @words = split /\s+/, $_; $id = $words[0]; $col2 = $words[1]; $col3 = $words[2]; $col4 = $words[3]; if ( !exists($col2{$id}) ) { $col2{$id} = $col2; $col3{$id} = $col3; $col4{$id} = $col4; } else { $col2{$id} .= " ".$col2; $col3{$id} .= " ".$col3; $col4{$id} .= " ".$col4; } $c++; $a= $c %= 1000000; if ($a == 0) {print "read another 1000000 lines!\n";} } while( my ($k, $v) = each %col2 ) { print "key: $k, value: $v.\n"; # print "key: $k\n"; }