"fatal: попытка деления на ноль" при попытке заменить часть строки - PullRequest
1 голос
/ 19 марта 2020

У меня есть такая строка:

first: val1       second: 6/Hi/how//I///, 5/Hi/how//you///, 8/Hi/how//she///     third: special

Я хочу только второе поле. Во втором поле мне нужно все после second:. Используя этот код, я могу достичь своей цели:

awk -F '\t' '/second:/ { split($2, a, / /); print a[2] }'

Теперь у меня есть это:

 6/Hi/how//I///, 5/Hi/how//you///, 8/Hi/how//she///

Теперь я хочу заменить /Hi/how// на /, поэтому мой ожидаемый вывод выглядит так:

first: val1       second: 6/I///, 5/you///, 8/she///     third: special

Я изменил свой код на это:

awk -F '\t' '/second:/ { split($2, a, / /); gsub(//Hi/how///,"/",a[2]; print a[2] }'

но я сталкиваюсь с этой ошибкой:

awk: cmd. line:1: (FILENAME=- FNR=4) fatal division by zero attempted
awk: cmd. line:1: (FILENAME=- FNR=4) fatal division by zero attempted
awk: cmd. line:1: (FILENAME=- FNR=4) fatal division by zero attempted

Что не так?

1 Ответ

1 голос
/ 19 марта 2020

Вы можете использовать это awk:

awk 'BEGIN{FS=OFS="\t"} $2 ~ /^second:/{ gsub(/\/Hi\/how\/\//, "/", $2) } 1' file

first: val1    second: 6/I///, 5/you///, 8/she///    third: special

Нет необходимости использовать split здесь. Обратите внимание, что / необходимо экранировать в вашем регулярном выражении, поскольку / является разделителем регулярных выражений в функции gsub.

После gsub также будет работать со строкой в ​​кавычках вместо регулярного выражения:

gsub("/Hi/how//", "/", $2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...