【问题标题】:Change character in only one column in a file仅更改文件中一列中的字符
【发布时间】:2014-04-16 15:15:03
【问题描述】:

我有一个看起来像这样的文件

0.9216  .   0
0.6774  .   1
0.7954  .   3
0.6375  .   1
0.6262  .   1

我想替换第二列“。”有一个不同的字符,一个“+”。

我可以使用 sed 来做到这一点:

sed 's/[.]/+/g' 

然后是“。”在我的第一列中也更改为加号。我一直在想,使用 awk 可能允许我将此语法仅应用于一列,但我无法正确使用语法。有什么建议么?谢谢!

编辑添加额外数据: 以下两种解决方案都适用于上面的缩写数据,但都不适用于扩展数据,看起来像这样:

dm  G   0.874   1   358 440 12  126890980   .   0
dm  G   0.8253  0.9582  358 440 4   57561647    .   1
dm  A   0.5438  0.9531  358 440 4   85161551    NA  1
dm  T   0.4991  0.8726  358 440 4   108826383   .   1
dm  A   0.7246  0.9817  358 440 4   114553253   .   1
dm  C   0.7691  0.9125  358 440 4   172776204   .   1

为什么会这样?我尝试为制表符指定空格,但它们都是制表符分隔的。

【问题讨论】:

    标签: awk sed


    【解决方案1】:

    使用sed:在其周围放置空格以将其与小数点分开。

    $ sed 's/ [.] / + /' file
    0.9216  +   0
    0.6774  +   1
    0.7954  +   3
    0.6375  +   1
    0.6262  +   1
    

    使用awk:虽然您会在修改列时释放额外的空格,但 awk 会使用默认的OFS 空格重建该行。

    $ awk 'sub(/[.]/," + ",$2)' file
    0.9216  +  0
    0.6774  +  1
    0.7954  +  3
    0.6375  +  1
    0.6262  +  1
    

    【讨论】:

    • 有没有办法指定制表符而不是空格以应用于附加数据?
    • @mfk534 为sedsed 's/ [.] /\t+\t/' file
    【解决方案2】:

    只需将空格添加到 distinct。

    > cat "0.9216  .   0" | sed "s# \. # \+ #"
    "0.9216  +   0"
    

    对于您可以使用的扩展数据:

    > cat "dm  T   0.4991  0.8726  358 440 4   108826383   .   1" | sed -r "s#(\s+)\.(\s+)#\1\+\2#"
    "dm  T   0.4991  0.8726  358 440 4   108826383   +   1"
    

    \s+ 匹配任何空白字符[\r\n\t\f ] 量词+:一次到无限次,尽可能多次,按需回馈。 \. 从字面上匹配字符。所有匹配的空格都被保留,只有点被替换为 +。

    【讨论】:

    • 如何指定制表符而不是空格?
    • @mfk534 你只需要用\t替换空格。
    【解决方案3】:

    您可以使用awk 并指定您希望更改的列,如下所示:

    awk '{sub(/\./,"+",$9)}1' file
    dm G 0.874 1 358 440 12 126890980 + 0
    dm G 0.8253 0.9582 358 440 4 57561647 + 1
    dm  A   0.5438  0.9531  358 440 4   85161551    NA  1
    dm T 0.4991 0.8726 358 440 4 108826383 + 1
    dm A 0.7246 0.9817 358 440 4 114553253 + 1
    dm C 0.7691 0.9125 358 440 4 172776204 + 1
    

    【讨论】:

      【解决方案4】:

      使用 awk

      awk '{$(NF-1)=$(NF-1)=="\."?"+":$(NF-1)}1' file
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-20
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 2019-07-28
        • 1970-01-01
        相关资源
        最近更新 更多