2012-12-19 105 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