Bash
用grep一次計算多個模式?
我編寫了一個 grep 循環來迭代計算包含 DNA 序列的 gzip 壓縮 DNA fasta 文件中的 DNA 三核苷酸,例如
declare -a tri=(AAA AAC AAG AAT CAA .. etc) for i in ${tri[@]} do gzip -cd gencode.v18.pc_transcripts.fa.gz | grep -v "^>" | grep -o $i | wc -l done
fasta 文件的格式在哪裡(雖然要大得多)
head test.fa >id1 TTTTTAAAAA >id2 GGGGGCCCCC etc..
雖然這有效(即計算每個三核苷酸的出現次數),但在我看來效率很低,因為它必須通過數據 64 次(每個可能的三核苷酸一次)。
我的問題是如何使用
bash
或grep
有一種方法可以一次通過文件計算每個三核苷酸(因為文件非常大)?謝謝
IFS=$'\n' gzip -dc file.gz | grep -v '^>' | grep -Foe "${tri[*]}" | sort | uniq -c
但順便說一句,
AAAC
同時匹配AAA
和AAC
,但grep -o
只會輸出其中一個。那是你要的嗎?AAA
另外, in出現了多少次AAAAAA
?2 還是 4 ([AAA]AAA
,A[AAA]AA
,AA[AAA]A
,AAA[AAA]
)?也許你想要:
gzip -dc file.gz | grep -v '^>' | fold -w3 | grep -Fxe "${tri[*]}" | sort | uniq -c
那就是將行分成 3 個字元為一組,並將出現次數計為整行(會發現 0 次出現
AAA
在ACAAATTCG
(因為那是ACA AAT TCG
))。或者另一方面:
gzip -dc file.gz | awk ' BEGIN{n=ARGC;ARGC=0} !/^>/ {l = length - 2; for (i = 1; i <= l; i++) a[substr($0,i,3)]++} END{for (i=1;i<n;i++) printf "%s: %d\n", ARGV[i], a[ARGV[i]]}' "${tri[@]}"
(會找到 4 次
AAA
inAAAAAA
)。