【问题标题】:Remove a character from second occurence从第二次出现中删除一个字符
【发布时间】:2014-11-27 11:09:42
【问题描述】:

如何在每一行的第一列之后删除,

$ cat tmp.txt
Name, Charles, James, Criss 
Age, 21, 25, 23

文件中可能有 n 个列。

我需要这样的输出

$ cat tmp.txt
Name, Charles James Criss
Age, 21 25 23

, 不应从第一列中删除。

【问题讨论】:

  • 我将标题更改为更有可能被搜索到的内容。任何提示如何改进它?对我来说听起来还是有点奇怪。

标签: shell unix awk sed gsub


【解决方案1】:

你可以告诉sed第二场第二场比赛中g局部进行:

$ sed 's/,//g2' file
Name, Charles James Criss 
Age, 21 25 23

【讨论】:

    【解决方案2】:
    sed ':still
    s/;//2
    t still' tmp.txt
    

    对于非 GNU sed,/g2 仅更改第 2 次出现

    【讨论】:

    • 但是g2 在我的sed (GNU sed) 4.2.2. 上运行良好。你能在它不工作的时候扩展吗?
    • 是的,你是对的,它在 on GNU sed 上工作,不在 posix one(我的 aix/sun 不会出错,但只会更改第二次出现)
    • 啊,好吧,我反过来理解了。那就为便携性 +1!
    【解决方案3】:

    在 Perl 中,我会通过 PCRE 动词 (*SKIP)(*F) 来执行以下操作。

    $ perl -pe 's/^\S+(*SKIP)(*F)|,//g' file
    Name, Charles James Criss 
    Age, 21 25 23
    

    ^\S+ 匹配出现在行首的一个或多个非空格字符。 (*SKIP)(*F) 导致匹配失败。所以现在它匹配除了第一列的逗号之外的所有逗号。

    $ perl -pe 's/^[^,]*,(*SKIP)(*F)|,//g' file
    Name, Charles James Criss 
    Age, 21 25 23
    

    ^[^,]*, 匹配第一个, 然后(*SKIP)(*F) 使匹配失败,剩余子字符串, 中的| 匹配所有逗号。

    【讨论】:

      【解决方案4】:

      使用 awk:

      'BEGIN{FS=","}{for(i=1;i<NF+1;i++){if(i==1){printf $i", "}else{printf $i" "}};printf "\n"}'
      

      这不是最优雅的方式,但效果很好。这里的关键是将字段分隔符设置为您想要删除的字符“,”,然后使用 printf(awk 的格式化打印功能)在您感兴趣的字段之间添加“,”(在这种情况下为 if( i==1),仅在字段 1 之后添加逗号。

      【讨论】:

        【解决方案5】:
        awk '{gsub(/,/,"")}{$1=$1","}1' file
        Name, Charles James Chriss
        Age, 21 25 23
        

        删除每个逗号并将其放回第一列。

        【讨论】:

          猜你喜欢
          • 2017-07-07
          • 2018-02-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-07
          • 1970-01-01
          相关资源
          最近更新 更多