2016-03-29 3 views
1

Мне нужно заменить второе вхождение шаблона (которое соответствует последнему полю) на другое, а также сохранить количество всех таких изменений, сделанных в файле.Заменить второе вхождение шаблона в строке с использованием awk

Пример: try.txt

Hi 

Change apple orange guava mango banana orange 

It's hot outside 

Change tom greg fred harry steve fred 

George is a cool guy 

Change mary lucy becky karly jill karly 

thank you 

Во всех линиях, что имеет шаблон «Change», я хочу, чтобы заменить последнее слово, например, «оранжевые» во второй строке, скажем, грушу. Обратите внимание, что первый апельсин не следует изменять. Я также хочу добавить суффикс, который показывает количество изменений, произошедших в файле.

Я пробовал следовать, но он менял оба места (1-й апельсин и 2-й апельсин, 1-й и 2-й фред, 1-й карли и 2-й карли), тогда как я хотел изменить только второе появление.

awk 'BEGIN {cntr=0} {if (/Change/) {gsub($NF,"pear"); OFS=""; print $0,cntr; cntr++} else {print}}' try.txt 

Выход:

Hi 

Change apple pear guava mango banana pear0 

It's hot outside 

Change tom greg pear harry steve pear1 

George is a cool guy 

Change mary lucy becky pear jill pear2 

thank you 

Желаемый результат:

Hi 

Change apple orange guava mango banana pear0 

It's hot outside 

Change tom greg fred harry steve pear1 

George is a cool guy 

Change mary lucy becky karly jill pear2 

thank you 

Когда GSUB заменяется подлодки, он меняется только первое вхождение. Любая помощь приветствуется.

ответ

1

Это один лайнер работает для ввода:

awk '/Change/{$NF="peal"(i++)}7' file 

Эта линия будет перезаписывать OFS, однако, если вы хотите сохранить OFS (непрерывные пробелы, например) нетронутым, вы можете сделать:

awk '/Change/{sub(/\S+$/,"peal"(i++))}7' file 
+0

Привет, Кент, спасибо, связка. Первое решение сработало. Но второй не меняет ввод. Он печатает файл как есть. – user6129328

+0

@ user6129328 Обе строки тестируются здесь с помощью gnu awk. – Kent

+0

Мне также нужно небольшое расширение для этого: что, если у меня есть другой шаблон, такой как «Change2», где все строки, содержащие этот шаблон, нужно заменить, скажем, peal2, а также иметь свой собственный счетчик. – user6129328

0

Я думаю, что я нашел работу вокруг:

AWK «BEGIN {CNTR = 0} {если (/ Изменить /) {$ NF = $ NF_cntr; к югу ($ NF, "груша"); ФС = ""; print $ 0, cntr; OFS = ""; cntr ++} else {print}} 'try.txt

Выход был, как я и хотел.

Но я все еще хотел бы услышать от сообщества, чтобы получить лучшие способы его достижения.

Thanks

Смежные вопросы