Awk
將帶有腳手架的 fasta 文件劃分為與腳手架 ID 和序列相關的相同長度的文件
我目前正在處理一個包含腳手架的大型 fasta 文件(3.7GB)。每個支架都有一個唯一的標識符,從
>
第一行開始,在連續的一行中,它的 DNA 序列如下所示:>9999992:0-108 AAAGAATTGTATTCCCTCCAGGTAGGGGGGATAGTTGAGGGGATACATAG TGGGAAGGCTTTTCATGCGGAGGGACTAGAATGTGCTCCCGACTGACAAA GCAGCTTG >9999993:0-118 AGGGACTAGAAATGAGATTAAAAAGAGTAAAAGCACTGATACAAGTACAA AAACAAATTGCTTCACCTCCAAAACCCCAGAAACTGCCCCACTTGGCTCC CATTTAACCTACCTTCAA >9999994:0-113 CCATCCTCATCCTTTCCTCCCCATATCTTCCTCTGACCCCAAAGCTCAGG TTTCCTGTCTTGTTTCCCAGAATCTGTACCTCATGGTAGTTAAACCTTCC CCTCTGGCAGCCA >9999997:0-87 AACATCCCTGTGGCCTGAGAGACTGCCAGCCACAGCGGTGACAGTCCCTG CGAGAGGCTGCTGCAAAAAGACTGGAGAGAAAGCAGA >9999998:0-100 AAACATCAGCGCCAAGTCCCCGAAACCAGCAGGGTCACTGGGCGGCCGGC CTGAAATACCCCAGCAGGCCAGCAGTGCCGGGTGCCTGGGGAGGTGTCCT >9999999:0-94 AAGAAACTTTTCCCTTAACCAATGAAGAGTTTTATGTAAAGGAAATTTAG TAATTTTTTAAAAAATGGTAATGACAGATTTAAGTAATTTAATT
我想將文件拆分為最好具有相同長度的小文件來處理它,但我需要同時尊重 ID 和序列,並獲得如下內容:
file1.fa >9999992:0-108 AAAGAATTGTATTCCCTCCAGGTAGGGGGGATAGTTGAGGGGATACATAG TGGGAAGGCTTTTCATGCGGAGGGACTAGAATGTGCTCCCGACTGACAAA GCAGCTTG >9999993:0-118 AGGGACTAGAAATGAGATTAAAAAGAGTAAAAGCACTGATACAAGTACAA AAACAAATTGCTTCACCTCCAAAACCCCAGAAACTGCCCCACTTGGCTCC CATTTAACCTACCTTCAA file2.fasta >9999994:0-113 CCATCCTCATCCTTTCCTCCCCATATCTTCCTCTGACCCCAAAGCTCAGG TTTCCTGTCTTGTTTCCCAGAATCTGTACCTCATGGTAGTTAAACCTTCC CCTCTGGCAGCCA >9999997:0-87 AACATCCCTGTGGCCTGAGAGACTGCCAGCCACAGCGGTGACAGTCCCTG CGAGAGGCTGCTGCAAAAAGACTGGAGAGAAAGCAGA file3.fasta >9999998:0-100 AAACATCAGCGCCAAGTCCCCGAAACCAGCAGGGTCACTGGGCGGCCGGC CTGAAATACCCCAGCAGGCCAGCAGTGCCGGGTGCCTGGGGAGGTGTCCT >9999999:0-94 AAGAAACTTTTCCCTTAACCAATGAAGAGTTTTATGTAAAGGAAATTTAG TAATTTTTTAAAAAATGGTAATGACAGATTTAAGTAATTTAATT
請幫我。我曾嘗試使用
csplit
和 grep,但我得到了錯誤的輸出。
下面的程式碼可能會對您有所幫助,但對於大文件可能會很慢(根據您的電腦規格)。
首先,你應該得到總數
Unique Identifier
。您可以通過使用來實現grep -c
total=$(grep -c "^>" largeFastaFile.txt)
上面的程式碼將為
total
變數分配以 . 開頭的匹配行的計數>
。現在你應該得到Unique Identifier
每個文件的數量。所以如果你想有10 個文件。你應該劃分total/10
:max=$((total/10)) #If total has 3714529 then max will have 371,452.
最後使用
awk
命令,您可以將大文件分成 10 個文件(實際上是 11 個),每個文件大約有371,452 個唯一標識符:awk -v maxline=$max -v count=0\ '{if(NR>1) { if( (NR-2)%maxline == 0 ) count++ ; print ">"$0 >("file"count".fasta") } }'\ RS='>' largeFastaFile.txt
腳本應如下所示:
#!/bin/bash total=$(grep -c "^>" largeFastaFile.txt) max=$((total/10)) # where 10 is the number of files you will get awk -v maxline=$max -v count=0 '{if(NR>1) { if( (NR-2)%maxline == 0 ) count++ ; print ">"$0 >("file"count".fasta") } }' RS='>' largeFastaFile.txt
實際上你會得到 11 個文件,因為如果總數是
3714529
並且你想要 10 個文件,371,452 Unique Identifier
每個文件的數量相同,那麼將會有幾行必須在另一個文件中:371,452 * 10 = 3,714,520
所以第11 個文件將有最後9 個唯一標識符