1 300 1_a 30 1_b 20 1 300 2_a 22 2_b 12 1 320 1_a 10 1_b 30 1 320 2_a 32 2_b 22 2 320 1_a 31 1_b 20 2 320 2_a 21 2_b 12 #### use strict; use warnings; my $PRINTF = '%3s %3s %s %s %s %s'; my $HEADERS = 2; my @prev_cells; while () { # Input data. my @cells = split /\t/, $_; # Format the data for printing. $cells[0] .= ' -'; # Remove redundant headers. my @display_cells = @cells; if (@prev_cells) { for (@display_cells[ 0 .. $HEADERS-1 ]) { last if $_ ne shift @prev_cells; $_ = ''; } } @prev_cells = @cells; # Output data. printf $PRINTF, @display_cells; } __DATA__ 1 300 1_a 30 1_b 20 1 300 2_a 22 2_b 12 1 320 1_a 10 1_b 30 1 320 2_a 32 2_b 22 2 320 1_a 31 1_b 20 2 320 2_a 21 2_b 12 2 320 2_a 33 2_b 44 #### 1 - 300 1_a 30 1_b 20 2_a 22 2_b 12 320 1_a 10 1_b 30 2_a 32 2_b 22 2 - 320 1_a 31 1_b 20 2_a 21 2_b 12 2_a 33 2_b 44