Я применяю awk-команду к файлу, но этот файл не изменяется.
awk 'BEGIN{FS=OFS=""}; {if($692=="6") sub($690,"9");print $0;}' abc.txt >efg.txt
Примечание: каждая строка содержит около 1000 символов.
Ключевая проблема заключается в том, что вы неправильно используете 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 по умолчанию
Ключевая проблема заключается в том, что вы неправильно используете 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 по умолчанию