Що не так
Основне питання полягає в тому, що ви використовуєте 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
за замовчуванням