从网上下载的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参数,指定其使用扩展正则表达式)
最终结果序列名称更加精简,序列中不含特殊字符,并且变成一行,可以用于下游分析。