Bash Grep-A1-f返回的结果比它应该返回的多

Bash Grep-A1-f返回的结果比它应该返回的多,bash,command-line,grep,fasta,Bash,Command Line,Grep,Fasta,这是我的问题: 我有一个包含遗传数据的fasta文件(my.fasta): 我还有一个名称列表,它是my.fasta文件的子集,我想为它们提取序列(names.list): 我想得到的是: >TR3|c0_g1_i1 CGGATCATGGTCTTGGTCAAAA >TR4|c0_g1_i1 ATTGGGGGTTTTAAACTGGCGAA... 我正在做:grep-A1-f names.list my.fasta | grep-v“^--$”>new.fasta 但是!我的姓名中有

这是我的问题:

我有一个包含遗传数据的fasta文件(
my.fasta
):

我还有一个名称列表,它是my.fasta文件的子集,我想为它们提取序列(
names.list
):

我想得到的是:

>TR3|c0_g1_i1
CGGATCATGGTCTTGGTCAAAA
>TR4|c0_g1_i1
ATTGGGGGTTTTAAACTGGCGAA...
我正在做:
grep-A1-f names.list my.fasta | grep-v“^--$”>new.fasta

但是!我的
姓名中有30566姓名。列表中有
grep-c>“new.fasta31080

我有
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的姓名列表: 我想要的子集的名称列表:


谢谢

您的一些姓名相互包含,例如:
TR74928 | c6 | u g4 _i1
TR74928 | c6 | u 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、 --行regexp 仅选择与整行完全匹配的匹配项。这 选项的效果与使用^和$锚定表达式的效果相同

更简单的解决方案是:

grep-A1-w-f name.list my.fasta | grep-v“^--$”>new.fasta

但是,只有在
my.fasta
中没有标识符行包含多个“单词”(标识符)时,这才有效

-w、 --word regexp 仅选择包含构成整词的匹配项的行。这个 测试是匹配的子字符串必须位于 行,或前面有非单词组成字符。同样地, 它必须位于行的末尾或后跟非单词 构成特征。单词的组成字符是字母, 数字和下划线


将你的文件上传到某个地方,并将其链接添加到你的问题。你的
my.fasta
中难道没有像“TR3 | c0_g1_i10”这样的名字吗?如果您这样做,则可以使用您的
名称列表中的一个名称匹配多个名称。你能给一些额外的名字吗?每个名字都是唯一的,因为它们都代表唯一的转录本。由于研究结果尚未公布,我无法上传这些文件。我检查了几个额外的名称,但它们不在names.list文件中。您认为它可能不会在“|”之后读取任何内容吗?我已经上传了所有文件中的名字列表,并将它们添加到上面的帖子中。@user261007不,重点是一些名字可能包括其他名字。。。试试这个:
sed-e's/^/>/g'names.list>copy.list
然后
grep-A1-x-f copy.list my.fasta | grep-v“^--$”>new.fasta
TR3|c0_g1_i1
TR4|c0_g1_i1
>TR3|c0_g1_i1
CGGATCATGGTCTTGGTCAAAA
>TR4|c0_g1_i1
ATTGGGGGTTTTAAACTGGCGAA...