use warnings; use strict; use Data::Dumper; my @lines = split /\n/, `cat data.txt`; my %out; for (@lines){ next if /CoID:/; my ($co, $type, $state, $id) = split; next if ! $id; next if $type ne 'A'; $out{$id}->{CoID} = $co; $out{$id}->{State} = $state; } print Dumper \%out;