无论行如何,都使用awk替换文件中第n个字符

时间:2011-08-05 19:08:20

标签: replace awk

我正在尝试使用awk替换第n次出现的字符或字符串。

所以如果我们的数据是这个

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

我们试图替换|用A

然后输出应该如下所示,假设我们想要替换每个第3次出现

||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 个答案:

答案 0 :(得分:3)

使用GNU awk:

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

在OP澄清后调整:

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