use warnings; use strict; my %files; while () { my ($name, $data) = /^(\w+)\s+(.*)/; last if ! defined $data || ! length $data; open $files{$name}, '>', "$name.out" if (! defined $files{$name}); syswrite $files{$name}, $data . "\r\n"; } close $files{$_} for (keys %files); __DATA__ T001 Test1 012354 Abcde T001 Test1 013456 bcdef T002 Test2 024567 xxxxx T001 Test1 012354 yyyyy T003 Test3 02345 cdefg T002 Test2 000000 56789