使用sed或awk删除特定点之前的字符,直到空格之前

时间:2018-04-12 08:07:27

标签: macos awk sed

我想从特定点删除字符,直到第一个空格之前(不删除空白本身)。例如,我的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等)以进行某些分析。)

2 个答案:

答案 0 :(得分:2)

在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

答案 1 :(得分:1)

  

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

最好尽可能地将样本提供给实际用例。我已经更改了样本数据,以便在X之后将i更改为数字..如果这没有帮助,请添加更好的示例问题

$ 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