通过awk字符串处理函数substr遍历字符串(如基因组)

在处理全基因组序列时,有时候需要一段一段的遍历基因组序列,分析各个区域序列的特征。比如我有一个细菌基因组5M,我需要截断成5000bp的片段,或者每隔1000bp截取5000bp,一直到把整个基因组截取完毕,然后对这些所有的片段做分析。

当然最简单的是用python的字符串加索引功能,详情见本人文章使用countvectorizer 和tf-idf来编码文字/DNA序列 中的第一部分“1. 对dna 打断成kmer并处理成word格式”。这儿推荐一条更好的使用awk的命令,只需要一条命令,速度更快;
目标是将全基因组序列的fasta文件,每隔1000bp取5000bp的片段,直至取到末尾,将这些获得片段可以用于进一步的分析

$less 525362.3.fna
>NZ_GG693015   Lactobacillus ruminis ATCC 25644 genomic scaffold SCAFFOLD1, whole genome shotgun sequence.   [Lactobacillus ruminis ATCC 25644 | 525362.3]
tttaaaagttattttcgattcgatttaacaaaatcaatttgccgaccaaattattatcgcacctttcaaaagaaatgtcaacaataattttatttaattttgcgttgctcaattacaacaactttaatatcttaccacgttcaaacatatgcgtcaacatctttttgaaccaaatattttaaaagttgattgctcaatcagcgacctttttagtataccacgttaagaaaaaataacaaggcatttcttcaaaataatttatctacttgaatatttatttggaattctccttaattcctaaaacagttcgcctttttagcactgcattacaaaaaaaagaagccaagaatatcattctttagcttccttccaagttattttccctcagcgatatcctctaaggcacttttgacccatccgtcaattctgcttgcaatcggtgcaaaaccttcatgaacgtgacgattc...............

# 使用awk 每隔1000bp打断一次
$ awk '{if(NR%2==1)a=$1;else{len=length($0)-5000; i=1; while(i<=len){print a"_"i;print (substr($0,i,5000));i=i+6000;}}}'  525362.3.fna >525362.3_frag.fa

$ grep ">" 525362.3_frag.fa
>NZ_GG693015_1       
>NZ_GG693015_6001    
>NZ_GG693015_12001   
>NZ_GG693015_18001   
>NZ_GG693015_24001   
>NZ_GG693015_30001   
>NZ_GG693015_36001   
>NZ_GG693015_42001   
>NZ_GG693015_48001   
>NZ_GG693015_54001   
>NZ_GG693015_60001   
>NZ_GG693015_66001   
>NZ_GG693015_72001   
>NZ_GG693015_78001   
>NZ_GG693015_84001   
>NZ_GG693015_90001   

可以看出已经全部打断完毕了

这个代码中if(NR%2==1)a=$1记录奇数行,即序列抬头,记下序列的名字。对于偶数行(else命令段),首先获得序列的长度,由于要截取5000bp,因此序列起始位置应该不高于序列全长-5000,即len=length($0)-5000,随后使用while循环,第一次从1处取5000bp,使用awk内置函数substr()字符串截取函数:(substr($0,i,5000))。第二次取得时候跳过1000bp,即从5000+1000=6000的位置取第二个5000bp,开始位置为i=i+6000=6001,即(substr($0,6001,5000)),从6001处取到第二个5000bp后,再次空出1000bp,再取5000,依次循环,即可取到所有序列。如果中间不想空1000bp,只需要把步长6000改成5000即可,即

awk '{if(NR%2==1)a=$1;else{len=length($0)-5000; i=1; while(i<=len){print a"_"i;print (substr($0,i,5000));i=i+5000;}}}' genome.fa >genome_frag.fa

猜你喜欢

转载自blog.csdn.net/weixin_44022515/article/details/104971417