use strict; use warnings; my ($delim, $row, $col, $val, %matrix, %cols, @rows, @cols) = ' '; while () { chomp; ($row, $col, $val) = split /, /, $_; $matrix{$row}{$col} = $val; $cols{$col} = (); } @cols = sort keys %cols; @rows = sort keys %matrix; print join $delim, ' ', @cols; for $row (@rows) { print "\n", $row; for $col (@cols) { print $delim, $matrix{$row}{$col} ? sprintf('%3d', $matrix{$row}{$col}) : ' -'; } } __DATA__ ob1, ob2, 34 ob1, ob3, 56 ob1, ob4, 12 ob1, ob5, 78 ob1, ob6, 23 ob3, ob1, 56 ob7, ob1, 23 ob8, ob1, 12 ob9, ob1, 90