Você está entendendo mal a sintaxe do comando printf (que segue de perto o da função C subjacente: veja por exemplo man 3 printf para documentação completa).
printf tem uma sequência de formatos > que consiste em uma sequência de especificadores de formato e outros caracteres literais, seguidos por tantos argumentos separados por vírgula quantos forem necessários para preencher o dado formato. Em seu comando
printf "%s,%d,%0.2f%\n",c[i]"\t"a[i]"\t"100*b[i]/x"%"
você está dizendo para esperar 3 valores (um %s , um %d e um %0.2f ), mas está dando a ele um único argumento concatenado de string c[i]"\t"a[i]"\t"100*b[i]/x"%" . Por isso, ficará sem argumentos durante a tarefa.
O que você supostamente pretendia é
printf "%s\t%d\t%0.2f%%\n", c[i], a[i], 100*b[i]/x
(as guias ficam dentro da string de formatação; o %% corresponde a um literal % , ou seja, impede que % seja interpretado como o início de outro especificador de formato).