Що не так
Основне питання полягає в тому, що ви використовуєте sub()неправильно. sub()передбачається замінити на основі відповідності шаблону (це важлива частина!). Правильний синтаксис:
sub(regular_expression,replacement,substring)
Те, що ви робите, це sub($692,"9")так, що ви говорите йому, щоб замінити перше виникнення того самого, що ви бачите в полі 692 поля, але це перше виникнення може бути шлях вперед у рядку.
Ось приклад:
$ echo "1253456" | awk 'BEGIN{FS=OFS=""};{if($4==3) sub($6,"@");print}'
12@3456
Це буквально займає будь-що в 6-му полі (яке є числом 5) і видаляє перше виникнення цієї речі. Те саме, що робила ваша команда.
Що насправді слід зробити
Щоб замінити певне поле, вам не потрібно sub(), просто призначте це поле безпосередньо.
awk 'BEGIN{FS=OFS=""}; {if($692==6) $690="9";print}' abc.txt >efg.txt
Зверніть увагу , що я також видалений $0з , printтому що виклик printсам уже передбачає $0за замовчуванням