my @rows = map { chomp; [ split /;/ ] } <>; # now you have an array of arrays (rows of columns) my @non_zero_columns = grep { my $column = $_; grep { $_->[$column] != 0 } @rows } 0 .. $#{$rows[0]}; for ( @rows ) { print "@{$_}[ @non_zero_columns ]\n"; } #### my %zero_columns; @zero_columns{ 0 .. $#{$rows[0]} } = (); # initially, all columns might have 0. # eliminate any columns that have non-0 in any row: for ( my $r = 0; $r <= $#rows && keys %zero_columns; $r++ ) { for my $i ( keys %zero_columns ) { $rows[$r][$i] == 0 or delete $zero_columns{$i}; } } # invert the set: my @non_zero_columns = grep { ! exists $zero_columns{$_} } 0 .. $#{$rows[0]};