Você estava perto, apenas desnecessariamente complicou essa tarefa. Tente awk -f script.awk main.txt index.txt
(observe a ordem inversa dos arquivos) com o seguinte script:
#!/bin/awk
BEGIN {
FS = "|"
}
( NR == FNR ) {
lookup[toupper($1)] = $0
}
( NR > FNR ) {
key = toupper($1)
n=split(lookup[key], replacements, "|")
replacements[$2+1]=$3
for (i=1; i<n+1; i++)
printf "%s|", replacements[i]
printf "\n"
}
O resultado é
key1|1001|2000|3000|4000|
key1|2001|2000|3000|4000|
key2|1000|3001|3000|4000|
key2|1000|4001|3000|4000|
Não tenho certeza se você deseja manter os pipes |
no final das linhas, mas é trivial removê-los de qualquer forma.
O principal problema com a sua abordagem foi que a matriz lookup
foi substituída toda vez que a nova linha teve o mesmo key
da anterior. Assim, é preciso inverter a ordem dos arquivos - primeiro leia este que tem o primeiro campo exclusivo para usá-lo como um índice de matriz.
E BTW, isso é puro awk
solution, nada a ver com ksh
ou qualquer outro shell.