заменить n-ное вхождение символа в файле с помощью awk независимо от строки - PullRequest
2 голосов
/ 05 августа 2011

Я пытаюсь заменить n-ное вхождение символа или строки независимо от строки, используя awk.

Итак, если наши данные были такими:

|||||||
||||||
|||||
|||

, и мы пытались заменить|с A

тогда вывод должен выглядеть следующим образом, при условии, что мы хотим заменить каждый 3-й occurance

||A||A|
|A||A|
|A||A
||A

Текущая команда awk, которую я использую, это

 awk '/|/{c++;if(c==3){sub(/|/,"A");c=0}}1' test.data

и это неправильно выводит это

|||||||
||||||
A||||
|||

также данные могут выглядеть следующим образом

|||xfsafrwe|||asfasdf|
|safasf|||asfasdf||
||asfasf|||
|||

и результат, конечно, это

||Axfsafrwe||Aasfasdf|
|safasfA||asfasdfA|
|Aasfasf||A
||A

Спасибо

1 Ответ

3 голосов
/ 05 августа 2011

с GNU awk:

awk '{
  for (i = 0; ++i <= NF;)
    ++c % n || $i = v 
  }1' OFS= FS= n=3 v=A infile

Скорректировано после уточнения ОП:

awk '{
  for (i = 0; ++i <=NF;)
    if ($i == o)
      ++C % c || $i = n 
  } 1' FS= OFS= c=3 o=\| n=A infile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...