Use Sed.
Note que você não usará 0 posições indexadas, mas a partir de 1. Então, eu incrementei os números que você deu.
Além disso, você tem que voltar para a frente desde que, depois de alterar o primeiro, as posições das colunas mudam. Então use Sed assim:
sed 's/./&,/6;s/./&,/4;s/./&,/3'
Exemplo:
$ echo dxccsbc
dxccsbc
$ echo dxccsbc | sed 's/./&,/6;s/./&,/4;s/./&,/3'
dxc,c,sb,c
$
- O comando
s
em Sed é para substituição. - O padrão
.
corresponde a qualquer caractere único. - O
&
no texto de substituição significa "o texto que foi correspondido" e a vírgula é uma vírgula literal. - O sinalizador numérico após o último
/
significa executar apenas a substituição na "nth" correspondência na linha.
Se você quer ser realmente chique, use a expansão da chave Bash para criar os comandos Sed:
$ echo dxccsbc | sed '-es/./&,/'{6,4,3}
dxc,c,sb,c
Mas isso é apenas cereja no topo do bolo e, provavelmente, confuso, a menos que você entenda tanto Sed e Bash muito bem. :)
Se você quiser puxar a lista de posições de um arquivo separado (como você realmente mostra na sua pergunta), você pode fazer isso da seguinte forma:
sed -f <(sort -rn positionsfile | sed -n 's:^[1-9][0-9]*$:s/./\&,/&:p') file
Observe que isso é específico do Bash, pois usa a sintaxe de substituição do processo que não é POSIX. Note também que eu tornei isso bastante robusto, já que qualquer coisa, a não ser números no arquivo de posições (que não começam com 0), será descartado.
Resultados do teste:
$ cat file
abcdefg
ABCDEFG
abcdelaksjdflkjsdflli
sdlfihsdlfkj
$ cat positionsfile
2
15
5
7something
01
not a number
$ sed -f <(sort -rn positionsfile | sed -n 's:^[1-9][0-9]*$:s/./\&,/&:p') file
ab,cde,fg
AB,CDE,FG
ab,cde,laksjdflkj,sdflli
sd,lfi,hsdlfkj
$