Gostaria de ir para awk
, que fornece mais controle e generaliza o problema:
awk 'BEGIN{FS="\t"; OFS=","}
/^[^A-Z]/ {for (i=1; i<=NF; i++) {if (!a) a=$i; else a=a OFS $i} next}
{if (a) print a; a=""; print}
END{print a}'
Explicação
-
BEGIN{FS="\t"; OFS=","}
definir o separador de campo de entrada como separador e separador de campo de saída como vírgula.
-
/^[^A-Z]/ {for (i=1; i<=NF; i++) {if (!a) a=$i; else a=a OFS $i} next}
nas linhas que não começam com letra maiúscula, armazenam os valores em uma variável a
.
-
{if (a) print a; a=""; print}
no resto dos casos (isto é, linhas iniciando com letra maiúscula), imprima o valor armazenado junto com a linha atual.
-
END{print a}
depois de processar o arquivo inteiro, imprima a última variável armazenada com os valores do último bloco.
Veja a saída:
$ awk 'BEGIN{FS="\t"; OFS=","}/^[^A-Z]/ {for (i=1; i<=NF; i++) {if (!a) a=$i; else a=a OFS $i} next} {if (a) print a; a=""; print} END{print a}' file
ID1
1,5,6,8
ID2
1,4,5,7
No sed, lembre-se de que você sempre pode usar a opção -e
para combinar comandos.