【问题标题】:replace nth occurrence of character in a file using awk regardless of the line使用 awk 替换文件中第 n 次出现的字符,而不考虑行
【发布时间】:2011-10-21 03:27:09
【问题描述】:

我正在尝试替换第 n 次出现的字符或字符串,而不管使用 awk 的行如何。

如果我们的数据是这样的

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

我们试图替换 |与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

谢谢

【问题讨论】:

    标签: replace awk


    【解决方案1】:

    使用 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
    

    【讨论】:

    • 适用于我上面给出的第一个案例,但它不是正确的解决方案。我需要将第 n 次出现的字符串替换为“|”之类的字符串。上面我又举了一个例子。
    • @ppone,我添加了一个新版本。
    • awk '{ c=0; for (i = 0; ++i
    • 我根据您的解决方案提出了上述建议。但是你已经用更简洁的方式打败了我。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 2016-12-02
    • 2013-08-14
    • 2016-05-07
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    相关资源
    最近更新 更多