使用sed处理fasta序列中的特殊符号

从网上下载的DNA序列在做生物信息或者机器学习之前,需要对序列进行质控,观察是否有一些特殊字符如“-”,“>"等。sed 是一个字符处理命令,可以使用正则表达式,可以对序列替换,删除,查找等处理,速度非常块,本次使用sed处理序列
要处理的序列如下:

test$less test.fa
>BetaCov/Wuhan/IVDC-HB-01/2019|EPI_ISL_402119
ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTCGATCTCTTGTAGATCTGTTCTCTAAACGAACTTTAA
AATCTGTGTGGCTGTCACTCGGCTGCATGCTTAGTGCACTCACGCAGTATAATTAATAACTAATTACTGTCGTTGACAGG
ACACGAGTAACTCGTCTATCTTCTGCAGGCTGCTTACGGTTTCGTCCGTGTTGCAGCCGATCATCAGCACATCTAGGTTT
--
GTGATTTTAATAGCTTCTTAGGAGAATGACAAAAAAAAAAAAAAAAAAAAA>BetaCoV/Wuhan/IVDC-HB-04/2020|EPI_ISL_402120
ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTCGATCTCTTGTAGATCTGTTCTCTAAACGAACTTTAA
AATCTGTGTGGCTGTCACTCGGCTGCATGCTTAGTGCACTCACGCAGTATAATTAATAACTAATTACTGTCGTTGACAGG
ACACGAGTAACTCGTCTATCTTCTGCAGGCTGCTTACGGTTTCGTCCGTGTTGCAGCCGATCATCAGCACATCTAGGTTT
--
GTGATTTTAATAGCTTCTTAGGAGAATGACAAAAAAAAAAAAAAAAAAAAAAAAAA>BetaCoV/Wuhan/IVDC-HB-05/2019|EPI_ISL_402121
ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTCGATCTCTTGTAGATCTGTTCTCTAAACGAACTTTAA
AATCTGTGTGGCTGTCACTCGGCTGCATGCTTAGTGCACTCACGCAGTATAATTAATAACTAATTACTGTCGTTGACAGG
ACACGAGTAACTCGTCTATCTTCTGCAGGCTGCTTACGGTTTCGTCCGTGTTGCAGCCGATCATCAGCACATCTAGGTTT
--
GTGATTTTAATAGCTTCTTAGGAGAATGACAAAAAAAAAAAAAAAAAAAAA>BetaCoV/Wuhan/IPBCAMS-WH-01/2019|EPI_ISL_402123
ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTCGATCTCTTGTAGATCTGTTCTCTAAACGAACTTTAA
AATCTGTGTGGCTGTCACTCGGCTGCATGCTTAGTGCACTCACGCAGTATAATTAATAACTAATTACTGTCGTTGACAGG
1 .首先第二行下面的">"在中间,需要在此处分行,在“>"符号前面加\n换行符:
test$sed '2,$s/>/\n>/g' test.fa >test2.fa # 懂第2行开始到结尾行,将>替换为换行符(“\n”)+>
test$head test2.fa
>BetaCov/Wuhan/IVDC-HB-01/2019|EPI_ISL_402119
ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTCGATCTCTTGTAGATCTGTTCTCTAAACGAACTTTAA
AATCTGTGTGGCTGTCACTCGGCTGCATGCTTAGTGCACTCACGCAGTATAATTAATAACTAATTACTGTCGTTGACAGG
ACACGAGTAACTCGTCTATCTTCTGCAGGCTGCTTACGGTTTCGTCCGTGTTGCAGCCGATCATCAGCACATCTAGGTTT
--
GTGATTTTAATAGCTTCTTAGGAGAATGACAAAAAAAAAAAAAAAAAAAAA-----
>BetaCoV/Wuhan/IVDC-HB-04/2020|EPI_ISL_402120
ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTCGATCTCTTGTAGATCTGTTCTCTAAACGAACTTTAA
AATCTGTGTGGCTGTCACTCGGCTGCATGCTTAGTGCACTCACGCAGTATAATTAATAACTAATTACTGTCGTTGACAGG
ACACGAGTAACTCGTCTATCTTCTGCAGGCTGCTTACGGTTTCGTCCGTGTTGCAGCCGATCATCAGCACATCTAGGTTT

所有">"已在新的一行,查看序列行数:

test$wc -l test2.fa
21 test2.fa
test$grep ">" test2.fa|wc -l
4

大部分序列最好将fasta文件序列文件变成一行,而上面显示是多行fasta

2. 多行fasta变单行
test$awk '/^>/&&NR>1{print "";}{printf "%s",/^>/?$0"\n":$0}' test2.fa >test3.fa
test$head test3.fa 
>BetaCov/Wuhan/IVDC-HB-01/2019|EPI_ISL_402119
ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTCGATCTCTTGTAGATCTGTTCTCTAAACGAACTTTAAAATCTGTGTGGCTGTCACTCGGCTGCATGCTTAGTGCACTCACGCAGTATAATTAATAACTAATTACTGTCGTTGACAGGACACGAGTAACTCGTCTATCTTCTGCAGGCTGCTTACGGTTTCGTCCGTGTTGCAGCCGATCATCAGCACATCTAGGTTT--GTGATTTTAATAGCTTCTTAGGAGAATGACAAAAAAAAAAAAAAAAAAAAA------
>BetaCoV/Wuhan/IVDC-HB-04/2020|EPI_ISL_402120
ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTCGATCTCTTGTAGATCTGTTCTCTAAACGAACTTTAAAATCTGTGTGGCTGTCACTCGGCTGCATGCTTAGTGCACTCACGCAGTATAATTAATAACTAATTACTGTCGTTGACAGGACACGAGTAACTCGTCTATCTTCTGCAGGCTGCTTACGGTTTCGTCCGTGTTGCAGCCGATCATCAGCACATCTAGGTTT--GTGATTTTAATAGCTTCTTAGGAGAATGACAAAAAAAAAAAAAAAAAAAAAAAAAA
>BetaCoV/Wuhan/IVDC-HB-05/2019|EPI_ISL_402121
ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTCGATCTCTTGTAGATCTGTTCTCTAAACGAACTTTAAAATCTGTGTGGCTGTCACTCGGCTGCATGCTTAGTGCACTCACGCAGTATAATTAATAACTAATTACTGTCGTTGACAGGACACGAGTAACTCGTCTATCTTCTGCAGGCTGCTTACGGTTTCGTCCGTGTTGCAGCCGATCATCAGCACATCTAGGTTT--GTGATTTTAATAGCTTCTTAGGAGAATGACAAAAAAAAAAAAAAAAAAAAA
>BetaCoV/Wuhan/IPBCAMS-WH-01/2019|EPI_ISL_402123
ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTCGATCTCTTGTAGATCTGTTCTCTAAACGAACTTTAAAATCTGTGTGGCTGTCACTCGGCTGCATGCTTAGTGCACTCACGCAGTATAATTAATAACTAATTACTGTCGTTGACAGG:test$ # 序列最后没有分行,无换行符

test$wc -l test3.fa
7 test3.fa
test$grep ">" test3.fa|wc -l
4

产看行“>"数目发现有4条fasta序列,应该有8行,而显示只有7行,而且查看序列发现最后一行没有换行符,所以序列末尾和linux终端命令连在一起,因此在序列最后末尾加上换行符:
单行变多行有多条命令可用,可参考本人文章一条命令实现fasta序列多行变单行

3. 序列最后加上换行符
test$sed '$s/$/\n/' test3.fa >test4.fa
test$wc -l test4.fa
8 test4.fa
test$grep ">" test4.fa|wc -l
4

加换行符还有第二种方法:

sed -i '$a\' test3.fa

-i表示直接在原来文件中修改,$表示在最后一行处理,a表示在末尾添加,\后面更要添加的内容,由于sed添加内容会先先换行,所以这儿后面不加如何内容直接换行。如果想加内容直接加在\后面即可,如sed -i '$a\yourtext'

4. 去掉末尾的特殊符号

第一条序列末尾含有“----”横杠,需要删除,但序列中间的–应该保留

test$sed -r 's/\-+$//' test4.fa >test5.fa
test$cat test5.fa
>BetaCov/Wuhan/IVDC-HB-01/2019|EPI_ISL_402119
ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTCGATCTCTTGTAGATCTGTTCTCTAAACGAACTTTAAAATCTGTGTGGCTGTCACTCGGCTGCATGCTTAGTGCACTCACGCAGTATAATTAATAACTAATTACTGTCGTTGACAGGACACGAGTAACTCGTCTATCTTCTGCAGGCTGCTTACGGTTTCGTCCGTGTTGCAGCCGATCATCAGCACATCTAGGTTT--GTGATTTTAATAGCTTCTTAGGAGAATGACAAAAAAAAAAAAAAAAAAAAA
>BetaCoV/Wuhan/IVDC-HB-04/2020|EPI_ISL_402120
ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTCGATCTCTTGTAGATCTGTTCTCTAAACGAACTTTAAAATCTGTGTGGCTGTCACTCGGCTGCATGCTTAGTGCACTCACGCAGTATAATTAATAACTAATTACTGTCGTTGACAGGACACGAGTAACTCGTCTATCTTCTGCAGGCTGCTTACGGTTTCGTCCGTGTTGCAGCCGATCATCAGCACATCTAGGTTT--GTGATTTTAATAGCTTCTTAGGAGAATGACAAAAAAAAAAAAAAAAAAAAAAAAAA
>BetaCoV/Wuhan/IVDC-HB-05/2019|EPI_ISL_402121
ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTCGATCTCTTGTAGATCTGTTCTCTAAACGAACTTTAAAATCTGTGTGGCTGTCACTCGGCTGCATGCTTAGTGCACTCACGCAGTATAATTAATAACTAATTACTGTCGTTGACAGGACACGAGTAACTCGTCTATCTTCTGCAGGCTGCTTACGGTTTCGTCCGTGTTGCAGCCGATCATCAGCACATCTAGGTTT--GTGATTTTAATAGCTTCTTAGGAGAATGACAAAAAAAAAAAAAAAAAAAAA
>BetaCoV/Wuhan/IPBCAMS-WH-01/2019|EPI_ISL_402123
ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTCGATCTCTTGTAGATCTGTTCTCTAAACGAACTTTAAAATCTGTGTGGCTGTCACTCGGCTGCATGCTTAGTGCACTCACGCAGTATAATTAATAACTAATTACTGTCGTTGACAGG

第一行末尾-----已删除

参数意义:

  • r :扩展的正则表达式
  • s:sed替换命令;
  • \:转义符号;
  • +:扩展正则表达式,表示一个或者多个;
  • $:定位符,每行末尾。

如果序列中含有“ . ” “ * ”等符号时,也可以用该命令替换,如修改* 可用sed -r 's/\*+$//' test4.fa >test5.fa

5. 序列中间含有“-”,可能是比对时产生的,我们将其换成n

由于在序列名称中也有-,因此需要反向选择含有“>"的行,即出去开头含有“>"的行

test$sed '/^>/!s/-/N/g' test5.fa >test6.fa
test$cat test6.fa
>BetaCov/Wuhan/IVDC-HB-01/2019|EPI_ISL_402119
ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTCGATCTCTTGTAGATCTGTTCTCTAAACGAACTTTAAAATCTGTGTGGCTGTCACTCGGCTGCATGCTTAGTGCACTCACGCAGTATAATTAATAACTAATTACTGTCGTTGACAGGACACGAGTAACTCGTCTATCTTCTGCAGGCTGCTTACGGTTTCGTCCGTGTTGCAGCCGATCATCAGCACATCTAGGTTTNNGTGATTTTAATAGCTTCTTAGGAGAATGACAAAAAAAAAAAAAAAAAAAAA
>BetaCoV/Wuhan/IVDC-HB-04/2020|EPI_ISL_402120
ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTCGATCTCTTGTAGATCTGTTCTCTAAACGAACTTTAAAATCTGTGTGGCTGTCACTCGGCTGCATGCTTAGTGCACTCACGCAGTATAATTAATAACTAATTACTGTCGTTGACAGGACACGAGTAACTCGTCTATCTTCTGCAGGCTGCTTACGGTTTCGTCCGTGTTGCAGCCGATCATCAGCACATCTAGGTTTNNGTGATTTTAATAGCTTCTTAGGAGAATGACAAAAAAAAAAAAAAAAAAAAAAAAAA
>BetaCoV/Wuhan/IVDC-HB-05/2019|EPI_ISL_402121
ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTCGATCTCTTGTAGATCTGTTCTCTAAACGAACTTTAAAATCTGTGTGGCTGTCACTCGGCTGCATGCTTAGTGCACTCACGCAGTATAATTAATAACTAATTACTGTCGTTGACAGGACACGAGTAACTCGTCTATCTTCTGCAGGCTGCTTACGGTTTCGTCCGTGTTGCAGCCGATCATCAGCACATCTAGGTTTNNGTGATTTTAATAGCTTCTTAGGAGAATGACAAAAAAAAAAAAAAAAAAAAA
>BetaCoV/Wuhan/IPBCAMS-WH-01/2019|EPI_ISL_402123
ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTCGATCTCTTGTAGATCTGTTCTCTAAACGAACTTTAAAATCTGTGTGGCTGTCACTCGGCTGCATGCTTAGTGCACTCACGCAGTATAATTAATAACTAATTACTGTCGTTGACAGG

可见序列中间的–变成NN
参数意义

  • /^>/!s/-/N/g’
  • /^>/! : ^定位符,序列开头;/^>/ 匹配>开头的行,就是序列标题行。然后!否定符号,即符合匹配模式之外的行,就是序列行
  • s/-/N/g:s,sed 替换,g全局替换
6.序列名字太长,修改序列名字只保留accession
test$grep ">" test6.fa 
>BetaCov/Wuhan/IVDC-HB-01/2019|EPI_ISL_402119
>BetaCoV/Wuhan/IVDC-HB-04/2020|EPI_ISL_402120
>BetaCoV/Wuhan/IVDC-HB-05/2019|EPI_ISL_402121
>BetaCoV/Wuhan/IPBCAMS-WH-01/2019|EPI_ISL_402123

观察序列名称的模式,发现只需要把BetaCov…|删除即可,由于第一序列cov中的v为小写,需要正则表达是[]

test$sed 's/BetaCo[vV]\/.*|//' test6.fa >test7.fa
test$cat test7.fa 
>EPI_ISL_402119
ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTCGATCTCTTGTAGATCTGTTCTCTAAACGAACTTTAAAATCTGTGTGGCTGTCACTCGGCTGCATGCTTAGTGCACTCACGCAGTATAATTAATAACTAATTACTGTCGTTGACAGGACACGAGTAACTCGTCTATCTTCTGCAGGCTGCTTACGGTTTCGTCCGTGTTGCAGCCGATCATCAGCACATCTAGGTTTNNGTGATTTTAATAGCTTCTTAGGAGAATGACAAAAAAAAAAAAAAAAAAAAA
>EPI_ISL_402120
ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTCGATCTCTTGTAGATCTGTTCTCTAAACGAACTTTAAAATCTGTGTGGCTGTCACTCGGCTGCATGCTTAGTGCACTCACGCAGTATAATTAATAACTAATTACTGTCGTTGACAGGACACGAGTAACTCGTCTATCTTCTGCAGGCTGCTTACGGTTTCGTCCGTGTTGCAGCCGATCATCAGCACATCTAGGTTTNNGTGATTTTAATAGCTTCTTAGGAGAATGACAAAAAAAAAAAAAAAAAAAAAAAAAA
>EPI_ISL_402121
ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTCGATCTCTTGTAGATCTGTTCTCTAAACGAACTTTAAAATCTGTGTGGCTGTCACTCGGCTGCATGCTTAGTGCACTCACGCAGTATAATTAATAACTAATTACTGTCGTTGACAGGACACGAGTAACTCGTCTATCTTCTGCAGGCTGCTTACGGTTTCGTCCGTGTTGCAGCCGATCATCAGCACATCTAGGTTTNNGTGATTTTAATAGCTTCTTAGGAGAATGACAAAAAAAAAAAAAAAAAAAAA
>EPI_ISL_402123
ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTCGATCTCTTGTAGATCTGTTCTCTAAACGAACTTTAAAATCTGTGTGGCTGTCACTCGGCTGCATGCTTAGTGCACTCACGCAGTATAATTAATAACTAATTACTGTCGTTGACAGG

参数意义:
‘s/BetaCo[vV]/.*|//’

  • BetaCo[vV]:表示匹配BetaCov和BetaCoV
  • / :表示匹配名称中的“/”,需要转义符号“\”将其于sed命令的“\”区分开
  • .* :.任意字符,0次或者多次,此处也可改成+(1次或者多次,但要加-r参数,指定其使用扩展正则表达式)

最终结果序列名称更加精简,序列中不含特殊字符,并且变成一行,可以用于下游分析。

### 处理 Sed 中特殊字符的字符串替换 当使用 `sed` 命令进行字符串替换时,如果目标字符串或新字符串中含有特殊字符(如 `/`, `.`, `$` 等),则需要对这些特殊字符进行转义处理。通常的做法是在特殊字符前加反斜杠 `\` 来取消其特殊含义。 对于更复杂的路径或其他包含多个斜杠的情况,可以考虑改变分隔符以简化表达式。例如,在默认情况下,`sed` 使用正斜杠 `/` 作为分隔符;但是可以通过指定不同的字符(比如 `#` 或 `|`)来替代它[^2]。 #### 示例:将特定路径替换为另一路径 假设有一个文件夹下的所有文件中存在旧路径 `/home/user/old/path/to/resource` 并希望将其全部替换成新的路径 `/mnt/data/new/location/of/resource` 。此时可以直接采用如下命令: ```bash #!/bin/bash sed -i 's#/home/user/old/path/to/resource#/mnt/data/new/location/of/resource#g' $(find ./ -type f) ``` 这里选择了井号 `#` 而不是传统的斜线 `/` 作为了定界符,从而避免了频繁地对路径里的每一个斜线都做额外的转义操作[^4]。 另外一种情况是当待替换文本中有句点`.`这样的元字符时也需要特别注意。因为句点本身在正则表达式里代表着任意单个字符的意思,所以应该先把它转换成字面意义上的点即`\.`: ```bash #!/bin/sh sed -i 's#\.\./jre1\.8\.0_231/bin/java#\.\./\.\./jdk1\.8/bin/java#g' ``` 此例子展示了如何通过更改分隔符以及适当位置添加反斜杠的方式完成复杂模式下的精确替换任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值