这是我的问题:
我有一个包含基因数据的fasta文件(my.fasta
):
>TR1|c0_g1_i1
GTCGAGCATGGTCTTGGTCATCT
>TR2|c0_g1_i1
AAGCAGTGCAGAAGAACTGGCGAA...
我还有一个名单列表,它是my.fasta文件的一个子集,我想为它们提取序列(names.list
):
TR3|c0_g1_i1
TR4|c0_g1_i1
我想得到的是:
>TR3|c0_g1_i1
CGGATCATGGTCTTGGTCAAAA
>TR4|c0_g1_i1
ATTGGGGGTTTTAAACTGGCGAA...
我正在做:grep -A1 -f names.list my.fasta | grep -v "^--$" > new.fasta
但是!我的names.list
中有 30566 名称,当我grep -c ">" new.fasta
时,我 31080 。
我grep ">" new.fasta | cut -d' ' -f1 | tr -d '>' > new.names.list
然后cat names.list new.names.list > names.all.list
和sort names.all.list | uniq -c | grep " 1 " | | sed -r 's/ 1 //' > names.extra.list
最后得到了514个名字。他们是怎么到那儿的?!
整个my.fasta的名称列表:http://speedy.sh/PQpdD/names.myfasta.list 我想要的子集的名称列表:http://speedy.sh/kzqKr/names.list
谢谢!
答案 0 :(得分:0)
您的一些名字互相包含,例如:TR74928|c6_g4_i1
和TR74928|c6_g4_i10
。因此grep
每行会返回多个结果。
解决这个问题:
sed -e 's/^/>/g' names.list > copy.list
获取前缀为>
的名称,就像在文件my.fasta
中一样,然后:
grep -A1 -x -f copy.list my.fasta | grep -v "^--$" > new.fasta
准确匹配包含您的标识符的行。
-x, - line-regexp 仅选择与整行完全匹配的匹配项。这个 选项与使用^和$。
锚定表达式具有相同的效果
更简单的解决方案是:
grep -A1 -w -f names.list my.fasta | grep -v "^--$" > new.fasta
但只有当my.fasta
中的标识符行没有多个"单词" (标识符)。
-w, - word-regexp 仅选择包含构成整个单词的匹配项的行。该 test是匹配的子字符串必须位于开头 该行,或前面是非单词构成字符。同样的, 它必须位于该行的末尾或后跟非单词 组成性质。单词构成字符是字母, 数字和下划线。