2011-09-22 25 views
0

我有一個teb-delimited文件,其中一列有基因名稱,另一列有這些基因的表達值。我想用grep從這個文件中刪除某些基因。所以,這樣的:grep:一種模式可行但不是其他

"42261" "SNHG7" "20.2678" 
"42262" "SNHG8" "25.3981" 
"42263" "SNHG9" "0.488534" 
"42264" "SNIP1" "7.35454" 
"42265" "SNN" "2.05365" 
"42266" "snoMBII-202" "0" 
"42267" "snoMBII-202" "0" 
"42268" "snoMe28S-Am2634" "0" 
"42269" "snoMe28S-Am2634" "0" 
"42270" "snoR26" "0" 
"42271" "SNORA1" "0" 
"42272" "SNORA1" "0" 

變成這樣:

"42261" "SNHG7" "20.2678" 
"42262" "SNHG8" "25.3981" 
"42263" "SNHG9" "0.488534" 
"42264" "SNIP1" "7.35454" 
"42265" "SNN" "2.05365" 

我用,我已經用我有限的知識終端放在一起以下命令:

grep -iv sno* <input.text> | grep -iv rp* | grep -iv U6* | grep -iv 7SK* > <output.txt> 

所以命令,我的輸出文件缺少以sno,u6和7sk開頭的基因,但不知何故,grep已經刪除了所有在其中具有「r」的基因,而不是以「rp」開頭的基因。我對此很困惑。任何想法爲什麼sno *的作品,但rp *不是?

謝謝!

+0

你能在這裏粘貼一些輸入示例和你的預期輸出嗎? – Kent

+0

完成!應該考慮一下。 – AhmetZ

+0

是真的,你只需要第三列== 0的行? – Kent

回答

0

grep命令使用正則表達式,而不是匹配模式。

模式rp*表示「'r'後面跟着零個或多個'p'」。你什麼真的想要的是rp.*,或者甚至更好,"rp.*(或者甚至只是"rp,沒有任何意義在試圖grep之後的任何事情「rp」)。同樣,sno*的意思是「'sn',接着是零或多個'o'」。再次,你想要sno.*或​​(或甚至只是"sno)。

+0

謝謝KAK,好像*是罪魁禍首。我需要更多地瞭解正則表達式。 – AhmetZ

0

雖然這並不直接回答您的問題,但您的示例命令行中有一件事情您可能需要小心:無論何時使用特殊的shell元字符(如「*」),都需要轉義或引用它。所以,你的命令行應該看起來更像是:

grep -iv 'sno*' <input.text> | grep -iv 'rp*' | grep -iv 'U6*' | grep -iv '7SK*' > <output.txt> 

通常情況下,殼是聰明的,如果沒有文件匹配的glob,他們會用文字原樣(所以如果你輸入「富*」,但也有沒有以「foo」開頭的文件名,則字符串「foo *」將被傳遞給命令)。

+0

感謝Adam,我一定會牢記這一點,但是即使當我使用引號時,我也會丟失以r開頭的基因(或任何其他具有r的基因) – AhmetZ

0
grep -iEv "sno|rp|U6|7SK" yourInput 

測試:

kent$ cat b 
"42261" "SNHG7" "20.2678" 
"42262" "SNHG8" "25.3981" 
"42263" "SNHG9" "0.488534" 
"42264" "SNIP1" "7.35454" 
"42265" "SNN" "2.05365" 
"42266" "snoMBII-202" "0" 
"42267" "snoMBII-202" "0" 
"42268" "snoMe28S-Am2634" "0" 
"42269" "snoMe28S-Am2634" "0" 
"42270" "snoR26" "0" 
"42271" "SNORA1" "0" 
"42272" "SNORA1" "0" 

kent$ grep -iEv "sno|rp|U6|7SK" b 
"42261" "SNHG7" "20.2678" 
"42262" "SNHG8" "25.3981" 
"42263" "SNHG9" "0.488534" 
"42264" "SNIP1" "7.35454" 
"42265" "SNN" "2.05365" 
+0

感謝Kent 。奇蹟般有效! – AhmetZ

相關問題