O que está errado
A questão principal é que você está usando sub()
incorretamente. sub()
deve substituir com base na correspondência de padrões (essa é a parte importante!). A sintaxe correta é:
sub(regular_expression,replacement,substring)
O que você está fazendo é sub($692,"9")
, então você está dizendo para substituir a primeira ocorrência da mesma coisa que você vê no campo número 692, mas essa primeira ocorrência pode estar muito antes na linha.
Veja um exemplo:
$ echo "1253456" | awk 'BEGIN{FS=OFS=""};{if($4==3) sub($6,"@");print}'
12@3456
Isso literalmente toma o que quer que esteja no 6º campo (que é o número 5) e remove a primeira ocorrência dessa coisa. O mesmo que o seu comando estava fazendo.
O que realmente deve ser feito
Para substituir um campo específico, você não precisa de sub()
, basta atribuir diretamente ao campo.
awk 'BEGIN{FS=OFS=""}; {if($692==6) $690="9";print}' abc.txt >efg.txt
Observe que também removi $0
de print
porque chamar o próprio print
já assume $0
por padrão