Попробуйте, пожалуйста, посмотрите, соответствует ли он вашим потребностям:
awk 'FNR==NR { le=length($1); a[le][$1]=$2; if (maxL<le) maxL=le; next } { for(le=maxL;le>0;le--) if(length(a[le])) for (i in a[le]) gsub(i, a[le][i]) }1' "lookup.tab" "target.txt"
Он основан на ваших собственных попытках, но вместо случайной замены с использованием хэшей в массиве, сначала используйте более длинные ключи. [ 111]
Таким образом, и, основываясь на ваших примерах, я думаю, что этого достаточно, чтобы избежать ошибочных замен.