1

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

我试过了:

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

以下是文件的格式;

列表.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不在list.txt中

我如何^在列表中使用?

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

4

3 回答 3

2

添加整个单词 switch ( -w):

grep -w -A1 -f list.txt infile

输出:

>TE_final_35005 
ACGTACGATCAGT
>TE_final_1040
ACGTACGTACGT
于 2012-12-19T17:51:00.820 回答
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
于 2012-12-19T17:54:49.623 回答
1

正如其他人所提到的,添加-w标志是基于您的样本数据的最干净和最简单的方法。但是由于您明确询问了如何使用^in 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
于 2012-12-19T18:15:32.227 回答