Вы можете попробовать следующее:
awk 'NR==1{h=$0; next}
!seen[$3]++{f="FILE_"FILENAME"_"$3".txt";print h > f}
{print >> f}' infile
Вышеупомянутое сохраняет заголовок в переменной h
( NR == 1 {h = $ 0; next}
) тогда, если $ 3
не отображается (! Seen [$ 3] ++
т.е. если он впервые встречает текущее значение $ 3
), он устанавливает имя файла ( f = ...)
и записывает заголовок в filename ( print h> f
). Затем он добавляет всю строку к filename ( print >> f
). По умолчанию используется FS
(разделитель полей): пусто . Если вы хотите использовать |
как FS
(или даже регулярное выражение с gnu awk
), см. Комментарий cas ниже.