Grep -A1 -f返回的结果多于应有的结果

时间:2016-03-25 12:36:41

标签: bash command-line grep fasta

这是我的问题:

我有一个包含基因数据的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.listsort 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

谢谢!

1 个答案:

答案 0 :(得分:0)

您的一些名字互相包含,例如:TR74928|c6_g4_i1TR74928|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是匹配的子字符串必须位于开头                 该行,或前面是非单词构成字符。同样的,                 它必须位于该行的末尾或后跟非单词                 组成性质。单词构成字符是字母,                 数字和下划线。

相关问题