【问题标题】:Remove characters from specific point until before space using sed or awk使用 sed 或 awk 从特定点删除字符直到空格之前
【发布时间】:2018-09-22 06:55:49
【问题描述】:

我想从特定点删除字符,直到第一个空格之前(不删除空格本身)。比如我的file.txt如下:-

>DN256845_c2_g1_i1 len=56274 ACGGAGG
>DN256532_c0_g2_i19 len=23973 AATACTC
>DN256979_c8_g3_i32 len=16728 CGAAACT

'X' 是诸如 1 或 19 或 32 之类的数字,我希望它是:-

>DN256845_c2_g1 len=56274 ACGGAGG
>DN256532_c0_g2 len=23973 AATACTC
>DN256979_c8_g3 len=16728 CGAAACT

我曾使用过sed 's/_i.*//',但它删除了_i 之后的所有内容。我尝试过的其他代码是sed 's/_i.*\./\ /g'sed -E 's/_i.*+[^[: :]]//g' 最终没有任何改变。

如何使用 sed/awk 或任何其他方法解决此问题?我很感激帮助。谢谢!

编辑:根据 Sundeep 的建议,我编辑了问题以便于理解。这些数据实际上是 Trinity 成绩单标识符。我需要删除标识符(_i1 等)以进行一些分析)。

【问题讨论】:

    标签: macos awk sed


    【解决方案1】:

    在 awk 中:

    $ awk '{sub(/_[^_ ]+ /," ")}1' file
    >DN256845_c2_gXX len=56274 ACGGAGG
    >DN256532_c0_gXX len=23973 AATACTC
    >DN256979_c8_gXX len=16728 CGAAACT
    

    sed相同:

    $ sed 's/_[^_ ]\+ / /' file
    

    将下划线的第一个实例替换为除下划线或空格之外的所有内容。

    编辑:我想知道为什么我没有发布这个明显的 awk 来操纵 $1 的结尾:

    $ awk '{sub(/_[^_]+$/,"",$1)}1' file
    

    【讨论】:

    • 或者只是sed 's/_i[^ ]*//' file(或更一般地说,sed 's/_i[^[:space:]]*//' file
    • 当然,TIMTOWTDI。
    • 哇,非常感谢!现在我只是好奇它是如何工作的。
    • 解释为斜体。
    • 使用第一个字段的好技巧,然后它变得容易得多,例如:awk '{sub(/_i.*/,"",$1)}1' file
    【解决方案2】:

    'X' 是数字,例如 1 或 19 或 32

    提供尽可能接近实际用例的示例是个好主意。我已将示例数据更改为将 i 之后的 X 更改为数字。如果这没有帮助,请在问题中添加更好的示例

    $ cat ip.txt
    >DN256845_c2_gXX_i1 len=56274 ACGGAGG
    >DN256532_c0_gXX_i19 len=23973 AATACTC
    >DN256979_c8_gXX_i32 len=16728 CGAAACT
    
    $ sed 's/_i[0-9]* / /' ip.txt
    >DN256845_c2_gXX len=56274 ACGGAGG
    >DN256532_c0_gXX len=23973 AATACTC
    >DN256979_c8_gXX len=16728 CGAAACT
    
    • _i[0-9]* 匹配 _ 后跟零个或多个数字后跟空格
    • 用空格替换它

    对于这个用例,这也可以缩短为

    sed 's/_i[^ ]*//' ip.txt
    

    【讨论】:

      猜你喜欢
      • 2011-12-21
      • 2018-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多