2011-09-22 75 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

相关问题