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.txtcomo 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