Isso ocorre porque suas variáveis estão sendo definidas no subshell que você abre, dizendo cat <file> | while ... . Então, quando essa subshell estiver pronta, você não poderá mais acessar essas variáveis.
Em vez disso, diga:
while read; do
...
done < tots.txt
Interessante leitura: Eu defino variáveis em um loop que está em um pipeline. Por que eles desaparecem depois que o loop termina? Ou, por que não posso enviar dados para ler? .
Note também que você parece ter alguma confusão entre as variáveis awk e shell . O que quer que você defina em awk permanecerá lá, então dizer awk '{$var=2}' é duas vezes incorreto: variáveis no awk são definidas sem o $ ( $var se referirá ao número da coluna var ) e então o var é apenas no escopo de awk e não disponível no seu shell.
Talvez você queira fazer algo como:
results=($(awk 'BEGIN {print 1,2,3,"a"}'))
Para criar uma matriz results[] que você possa acessar mais tarde.