Awk

將帶有腳手架的 fasta 文件劃分為與腳手架 ID 和序列相關的相同長度的文件

  • October 13, 2022

我目前正在處理一個包含腳手架的大型 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 個唯一標識符

引用自:https://unix.stackexchange.com/questions/720784