Bash

用grep一次計算多個模式?

  • October 3, 2017

我編寫了一個 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 次(每個可能的三核苷酸一次)。

我的問題是如何使用bashgrep有一種方法可以一次通過文件計算每個三核苷酸(因為文件非常大)?

謝謝

IFS=$'\n'
gzip -dc file.gz | grep -v '^>' | grep -Foe "${tri[*]}" | sort | uniq -c

但順便說一句,AAAC同時匹配AAAAAC,但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 次出現AAAACAAATTCG(因為那是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 次AAAin AAAAAA)。

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