Tente:
awk -F, '/^#/{f=$NF".txt";cmt=$0; next} {printf "%s\n%s\n",cmt,$0 >f; close(f)}' file
Exemplo
Aplicado à sua entrada de amostra:
$ awk -F, '/^#/{f=$NF".txt";cmt=$0; next} {printf "%s\n%s\n",cmt,$0 >f; close(f)}' file
Depois que o acima é executado, os seguintes arquivos estão no diretório:
$ ls
file importantname1.txt importantname2.txt importantname3.txt
O conteúdo dos novos arquivos é:
$ cat importantname1.txt
#info1 info2 info3 ,importantname1
importanttext1
$ cat importantname2.txt
#info1 info2 info3 ,importantname2
importanttext2
$ cat importantname3.txt
#info1 info2 info3 ,importantname3
importanttext3
Como funciona
O awk lê o arquivo de entrada linha a linha. Nosso script classifica essas linhas como comentários ou não-comentários. Para linhas de comentário, o nome do arquivo e o comentário são salvos. Para não comentários, um novo arquivo é criado e impresso
-
'- F,
Isto diz ao awk para usar uma vírgula como o separador de campo na entrada. Desta forma, o nome do arquivo será sempre o último campo.
-
/^#/{f=$NF".txt";cmt=$0; next}
Se uma linha começar com
#
, salvaremos o último campo,$NF
, mais.txt
como um nome de arquivof
. Toda a linha de comentário é salva comocmt
. Em seguida, informamos ao awk para pular o restante dos comandos e pular para começar de novo na linhanext
. -
printf "%s\n%s\n",cmt,$0 >f; close(f)
Para linhas sem comentários, imprimimos o último comentário visto,
cmt
, e a linha atual,$0
, no nome do último arquivof
. Em seguida, fechamos o identificador de arquivo paraf
.
Protegendo contra nomes de arquivos incorretos
Se os campos a serem usados como nomes de arquivos contiverem /
, o sistema operacional interpretará os nomes dos arquivos como diretórios de inclusão. Para evitar isso, podemos substituir todos os /
por -
usando gsub(/\//, "-", f)
da seguinte forma:
awk -F, '/^#/{f=$NF".txt";gsub(/\//, "-", f); cmt=$0; next} {printf "%s\n%s\n",cmt,$0 >f; close(f)}' file