从字符串中间删除字符

lga*_*her 2 regex sed bioinformatics samtools

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

我想从此字段中删除连字符,但是我不能简单地从整个文件中删除所有连字符,因为读取的名称包含它们,例如 1713704_EP0004-T

大多数情况下都在尝试,tr,但这只是从文件中删除所有连字符。

tr -d '"-' < sample.fq.unaln.umi.sam > sample.fq.unaln.umi.re.sam
Run Code Online (Sandbox Code Playgroud)

输入是一个大于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
Run Code Online (Sandbox Code Playgroud)

所需的输出(即最后一个字段)

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
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

sjs*_*sam 5

awk

awk '{sub(/-/,"",$NF)}1' file
Run Code Online (Sandbox Code Playgroud)

是您所需要的。

说明

  • 这个很明显,你只关心最后一个字段。
  • NF是记录包含的字段总数,因此$ NF是最后一个字段。
  • sub(/-/,"",$NF)-空字符串替换最后一个字段中的,使更改保持不变。

GNU sed

对于这个同样的原因,

sed -Ei 's/^(.*)-/\1/' file
Run Code Online (Sandbox Code Playgroud)

将工作。它具有可以执行就地编辑的附加优点。

说明

  • -E选项启用扩展的正则表达式引擎。
  • (.*)是一个贪婪的搜索,它将与任意字符(.)匹配任意次(*)。对于贪婪的事实,它将匹配最后一个连字符。
  • ()品牌sed还记得发生了什么匹配。
  • 在替换部分中,我们只放置了匹配的部分\11因为我们只有一对括号,请注意,您可以根据需要设置任意数量)而没有连字符,从而有效地将其从应该出现的最后一个字段中删除。

注:GNU awk支持-i inplace,但我不知道从哪个版本。

  • 您不想在10M文件的所有行上执行此操作 (2认同)