2013-10-01 48 views
0

您好我有大文件有兩種線。以.1結尾,另一端以.2結尾。現在我必須用.2過濾掉所有的。正則表達式來過濾掉文件中的行

這是文件的前兩行。

>AT1G53860.1 | Symbols: | Remorin family protein | chr1:20107165-20109458 REVERSE LENGTH=1329 
>AT1G34370.2 | Symbols: STOP1 | C2H2 and C2HC zinc fingers superfamily protein | chr1:12551002-12552501 FORWARD LENGTH=1500 

當試圖使用grep -v "\.2*" test.txt > out.txt時,我得到了兩條線。我究竟做錯了什麼?

感謝 衆議員

回答

1

2*意味着,當你想有可能是因爲許多三三兩兩 - 包括他們沒有!

我建議是與你的正則表達式有點更精確,否則你可能會過濾掉你不想要的東西過濾:

grep -Ev '^>\w{9}\.2' test.txt > out.txt 

所以,我們想:

  • ^ - 從行的開頭看,
  • > - 恰好一個「>」char,
  • \w{9} - 恰恰就是個字符或數字或下劃線,
  • . - 只有一個點,
  • 2 - 數字 「2」。

的論點-E意味着擴展正則表達式,從而使\w{9}根據需要將工作。

+0

這正是我一直在尋找的。我早些時候嘗試過'AT [1-5] G \ d \ .1 \ s [|] *'以及'grep -v「\ .2 *」',但不幸的是他們都沒有工作。再次感謝您的幫助.. – upendra

+0

@ user1755155你的第一個正則表達式應該有'\ d {5}'而不是'\ d'。另外,您需要'-E'才能夠實際使用'\ d'。 –

1

你不會在搜索模式需要*。下面應該工作:

grep -v "\.2" test.txt > out.txt 

編輯

而且由drahnr指出,上述將在行的任意匹配.2。查看樣本輸入的特定模式,匹配模式應修改爲僅在行中第一個單詞的末尾匹配.2

egrep -v "^>\w+\.2" test.txt > out.txt 
+0

錯了,你需要指定某種方式開始或將(在本來應該由「0.2" 相匹配的線路不一定) – drahnr

+0

@drahnr匹配某行的」 0.2" 的任何occurence感謝您的反饋意見。確實如此。但是OP的問題並不十分明確。根據你的建議編輯。 – jkshah

1

您的文件似乎是基於列的。您也可以使用awk正則表達式來匹配第一列。

awk '$1!~/\.2$/' file 
+0

這工作太.. – upendra

相關問題