2012-12-19 67 views
1

我想要从其他更大的文件(输入)中提取名称列表,具有该名称以及与该名称相关的一些附加信息。我的问题是使用grep -f选项,因为它不匹配输入文件中的确切条目,而是包含一些包含相似名称的其他条目。grep -f forEXACT模式

我想:

$ grep -f list.txt -A 1 input >output 

以下是文件的格式;

LIST.TXT

TE_final_35005 
TE_final_1040 

输入文件

>TE_final_10401 
ACGTACGTACGTACGT 
>TE_final_35005 
ACGTACGATCAGT 
>TE_final_1040 
ACGTACGTACGT 

需要的输出:

>TE_final_35005 
ACGTACGATCAGT 
>TE_final_1040 
ACGTACGTACGT 

输出我得到:

>TE_final_10401 
ACGTACGTACGTACGT 
>TE_final_35005 
ACGTACGATCAGT 
>TE_final_1040 
ACGTACGTACGT 

虽然TE_final_10401不在列表中.txt

如何在列表中使用^

请帮助匹配确切的值或建议其他方式来做到这一点。

+0

@Thor我不确定是否有意或无意的行之间的空格? –

+0

@sudo_O:格式与[FASTA](http://en.m.wikipedia.org/wiki/FASTA_format)非常相似,通常不是双倍行距。 – Thor

回答

2

添加整个字的交换机(-w):

grep -w -A1 -f list.txt infile 

输出:

>TE_final_35005 
ACGTACGATCAGT 
>TE_final_1040 
ACGTACGTACGT 
+0

解决!非常感谢 – Ank

2

几件事情,首先删除文件的空白行:

sed -i '/^\s*$/d' file list 

然后-w仅用于匹配整个单词,而-A1将打印下一行赛后:

$ grep -w -A1 -f list file > new_file 

$ cat new_file 
>TE_final_35005 
ACGTACGATCAGT 
>TE_final_1040 
ACGTACGTACGT 
1

如其他人所说的,加入-w标志是基于你的样品数据最干净和最简单的方法。但既然你明确地问过你如何在list.txt中使用^,这里有另一种选择。

^和/或$锚添加到每个行list.txt

$ cat list.txt 
^>TE_final_35005[ ]*$ 
^>TE_final_1040[ ]*$ 

这个搜索你的模式在该行的开始,由>字符开头,而忽略任何尾随空格。那么你以前的命令将起作用(假设你删除这些空白行或将你的参数改为-A 2)。

,如果你想这些锚(在同一时间,并删除任何空行)添加到自动列表文件,使用此awk结构:

awk '{if($0 != ""){print "^>"$0"[ ]*$"}}' list.txt >newlist.txt 

或者如果你喜欢sed就地编辑:

sed -i '/^[ ]*$/d;s/\(.*\)/^>\1[ ]*$/g' list.txt