Ste*_*son 5 grep bash shell-script text-processing bioinformatics
我已经编写了一个 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
Run Code Online (Sandbox Code Playgroud)
fasta 文件采用这种格式的位置(虽然要大得多)
head test.fa
>id1
TTTTTAAAAA
>id2
GGGGGCCCCC
etc..
Run Code Online (Sandbox Code Playgroud)
虽然这有效(即计算每个三核苷酸的出现次数),但在我看来效率很低,因为它必须通过数据 64 次(每个可能的三核苷酸一次)。
我的问题是如何使用bash或者grep有没有一种方法可以在一次通过文件时计算每个三核苷酸(因为文件非常大)?
谢谢
IFS=$'\n'
gzip -dc file.gz | grep -v '^>' | grep -Foe "${tri[*]}" | sort | uniq -c
Run Code Online (Sandbox Code Playgroud)
但顺便说一句,AAAC匹配AAA和AAC,但grep -o只会输出其中之一。那是你要的吗?AAA另外, in出现了多少次AAAAAA?2 还是 4 (、、、、[AAA]AAA)?A[AAA]AAAA[AAA]AAAA[AAA]
也许你想要:
gzip -dc file.gz | grep -v '^>' | fold -w3 | grep -Fxe "${tri[*]}" | sort | uniq -c
Run Code Online (Sandbox Code Playgroud)
即将行分成 3 个字符的组,并将出现的次数计为整行(会发现 0 次出现AAAin 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[@]}"
Run Code Online (Sandbox Code Playgroud)
(会发现AAA中出现 4 次AAAAAA)。