Você poderia tentar assim:
awk 'NR==1{h=$0; next}
!seen[$3]++{f="FILE_"FILENAME"_"$3".txt";print h > f}
{print >> f}' infile
O item acima salva o cabeçalho em uma variável h
( NR==1{h=$0; next}
) e, se $3
não for visto ( !seen[$3]++
, por exemplo, se for a primeira vez que encontrar o valor atual de $3
), define nome_do_arquivo ( f=...)
e escreve o cabeçalho em nome_do_arquivo ( print h > f
). Em seguida, ele anexa a linha inteira ao nome_do_arquivo ( print >> f
Ele usa o padrão FS
(separador de campo): branco Se você quiser usar |
como FS
(ou até mesmo uma regex com gnu awk
) veja cas 'comentário abaixo.