我有一个带有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
是您所需要的。
说明
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/