Команда AWK выполнена с ошибкой, но не изменяет файл

Я применяю awk-команду к файлу, но этот файл не изменяется.

awk 'BEGIN{FS=OFS=""}; {if($692=="6") sub($690,"9");print $0;}' abc.txt >efg.txt

Примечание: каждая строка содержит около 1000 символов.

1
задан 26 May 2017 в 10:43

2 ответа

Что не так

Ключевая проблема заключается в том, что вы неправильно используете 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 по умолчанию

0
ответ дан 18 July 2018 в 12:42

Что не так

Ключевая проблема заключается в том, что вы неправильно используете 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 по умолчанию

0
ответ дан 24 July 2018 в 20:01

Другие вопросы по тегам:

Похожие вопросы: