regex - 从字符串中间删除字符

标签 regex sed bioinformatics samtools

我有一个带有RX:的SAM文件:字段包含12个碱基,中间用-RX:Z:CTGTGC-TCGTAA隔开

我想从此字段中删除连字符,但是我不能简单地从整个文件中删除所有连字符,因为读取的名称包含它们,例如1713704_EP0004-T
大多数时候都尝试过tr,,但这只是从文件中删除所有连字符。

tr -d '"-' < sample.fq.unaln.umi.sam > sample.fq.unaln.umi.re.sam

输入是一个大于10,000,000行的大型SAM文件,如下所示:
1902336-103-016_C1D1_1E-T:34    99  chr1    131341  36  146M    =   131376  182 GGACAGGGAGTGTTGACCCTGGGCGGCCCCCTGGAGCCACCTGCCCTGAAAGCCCAGGGCCCGCAACCCCACACACTTTGGGGCTGGTGGAACCTGGTAAAAGCTCACCTCCCACCATGGAGGAGGAGCCCTGGGCCCCTCAGGGG  NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN  MC:Z:147M   MD:Z:83T62cD:i:4    cE:f:0  PG:Z:bwa    RG:Z:A  MI:Z:34 NM:i:1  cM:i:3  MQ:i:36 UQ:i:45 AS:i:141    XS:i:136    RX:Z:CTGTGC-TCGTAA

所需的输出(即最后一个字段)
1902336-103-016_C1D1_1E-T:34    99  chr1    131341  36  146M    =   131376  182 GGACAGGGAGTGTTGACCCTGGGCGGCCCCCTGGAGCCACCTGCCCTGAAAGCCCAGGGCCCGCAACCCCACACACTTTGGGGCTGGTGGAACCTGGTAAAAGCTCACCTCCCACCATGGAGGAGGAGCCCTGGGCCCCTCAGGGG  NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN  MC:Z:147M   MD:Z:83T62cD:i:4    cE:f:0  PG:Z:bwa    RG:Z:A  MI:Z:34 NM:i:1  cM:i:3  MQ:i:36 UQ:i:45 AS:i:141    XS:i:136    RX:Z:CTGTGCTCGTAA

我该如何解决这个问题?

最佳答案

awk

awk '{sub(/-/,"",$NF)}1' file

是您所需要的。

说明
  • this中可以明显看出,您只关心最后一个字段。
  • NF是记录包含的字段总数,因此$ NF是最后一个字段。
  • sub(/-/,"",$NF)用空字符串替换最后一个字段中的-,使更改永久生效。

  • GNU sed

    由于this同样的原因,
    sed -Ei 's/^(.*)-/\1/' file
    

    将工作。它还有一个额外的优点,就是可以执行就地编辑。

    说明
  • -E选项启用扩展的正则表达式引擎。
  • (.*)是一种贪婪搜索,它将与任意字符(.)匹配任意次数(*)。对于贪婪的事实,它将匹配最后一个连字符之前的所有内容。
  • ()使sed记住匹配的内容。
  • 在替换部分,我们只放置匹配的部分\1(1,因为我们只有一对括号,请注意,您可以根据需要设置任意数量)而没有连字符,从而有效地将其从最后一个字段中删除发生。

  • 注意: GNU awk支持-i inplace,但是我不确定从哪个版本开始。

    关于regex - 从字符串中间删除字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55938014/

    相关文章:

    java - 用与其长度相同的 "."替换正则表达式

    java - java中类定义的正则表达式

    linux - sed 在一个文件中搜索多个字符串

    python - BioPython AlignIO ValueError 说字符串必须具有相同的长度?

    list - 尝试从 Biopython 获取分类信息

    python - "How can I tell if a string repeats itself in Python?"的更复杂版本

    javascript - 正则表达式上的无效量词 javascript 错误

    c# - 使用正则表达式删除 css 注释

    linux - 在文件中多次替换单词之间的字符串

    javascript - 除了英语之外,还可以使用非英语字母字符 - React-Native