使用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

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

扫描二维码关注公众号,回复: 12912535 查看本文章
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参数,指定其使用扩展正则表达式)

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

猜你喜欢

转载自blog.csdn.net/weixin_44022515/article/details/104257457
今日推荐