我目前正在學習使用 awk,并找到了一個我需要的 awk 命令,但不完全了解發生了什么。這行代碼采用一個名為 fasta 的基因組檔案,并回傳其中每個序列的所有長度。對于那些不熟悉 fasta 檔案的人來說,它們是 txt 檔案,其中可以包含多個稱為 contigs 的基因序列。它遵循以下一般結構:
>Nameofsequence
Sequencedata like: ATGCATCG
GCACGACTCGCTATATTATA
>Nameofsequence2
Sequencedata
該行在這里找到:
cat file.fa | awk '$0 ~ ">" {if (NR > 1) {print c;} c=0;printf substr($0,2,100) "\t"; } $0 !~ ">" {c =length($0);} END { print c; }'
我知道 cat 正在打開 fasta 檔案,檢查它的序列名稱行,并在某個時候計算資料部分中的字符數。但我不明白它如何分解子字串中的資料部分,也不明白它如何用每個新序列重置計數。
Ed Morton 編輯:這是上面的 awk 腳本,格式清晰gawk -o-:
$0 ~ ">" {
if (NR > 1) {
print c
}
c = 0
printf substr($0, 2, 100) "\t"
}
$0 !~ ">" {
c = length($0)
}
END {
print c
}
uj5u.com熱心網友回復:
首先格式化命令:
awk '
$0 ~ ">" {
if (NR > 1) {print c;}
c=0;
printf substr($0,2,100) "\t";
}
$0 !~ ">" {
c =length($0);
}
END { print c; }
' file.fa
該代碼將c用于字符計數。此計數從值 0 開始,每次>決議行時將重置為 0 。
所述inputline的長度被加到c當inputline是無>。
的值c必須在序列之后列印,因此當它找到一個新的>(不是第一行)或決議完整檔案時(用 塊END)。
正如您現在可能已經理解的那樣:
breaking down the data section in substrings是通過將輸入行與 a 匹配>,并
resetting the counts with each new sequence通過c=0在塊中使用 來完成$0 ~ ">"。
看Ed的評論:printf陳述句用錯了。我不知道 %s 在 fasta 檔案中出現的頻率,但這并不重要:%s用于輸入字串。
uj5u.com熱心網友回復:
@WalterA 已經通過解釋腳本的作用回答了您的問題,但如果您有興趣,這里有一個改進的版本,包括幾個小錯誤修復,printf input如果輸入檔案為空,您可以使用和列印空行,以及改進對同一條件進行兩次冗余測驗,>并單獨測驗和洗掉它,而不是一次全部洗掉:
BEGIN { OFS="\t" }
sub(/^>/,"") {
if (lgth) { print name, lgth }
name = $0
lgth = 0
next
}
{ lgth = length($0) }
END {
if (lgth) { print name, lgth }
}
或者你可以這樣做:
BEGIN { OFS="\t" }
sub(/^>/,"") {
if (seq != "") { print name, length(seq) }
name = $0
seq = ""
next
}
{ seq = seq $0 }
END {
if (seq != "") { print name, length(seq) }
}
但是附加到變數很慢,因此為序列的每一行呼叫 length() 實際上可能更有效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/317393.html
