use strict; use warnings; use Data::Dump qw/dd/; my %report; while (my $line = ) { next if $line =~ /^\s*$/; # skip empty lines my @fields = (split / /, $line); $report{$_}{$fields[$_]}++ for 2,4,5,9,7,1; } dd \%report; __DATA__ 483 OS dx-32 1 charles list4 aardvark.com ty-off lx-on C 01 483 DS dx-14 1 james list3 23.456.12.7 ty-on lx-on B 01 769 XO dx-32 5 sully nolist widgets.com ty-on lx-on V 07