正则表达式过滤掉文件中的行

时间:2013-10-01 23:10:08

标签: regex grep

嗨我有大文件有两种行。一个以.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时,我得到两条线。我做错了什么?

由于 众议员

3 个答案:

答案 0 :(得分:1)

搜索模式中不需要*。以下应该工作:

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

编辑

此外,正如 drahnr 所指出的那样,上面会在行中的任何地方匹配.2。查看样本输入的特定模式,应仅修改匹配模式以匹配行中第一个单词末尾的.2

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

答案 1 :(得分:1)

2*表示可能有两个人想要的人数 - 不包括任何人!

我建议您使用正则表达式更准确一些,或者您可以过滤掉您不想要过滤的内容:

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

所以,我们想要:

  • ^ - 从行的开头看,
  • > - 恰好一个“>”炭,
  • \w{9} - 正好九个字符或数字或下划线,
  • . - 正好一个点,
  • 2 - 数字“2”。

参数-E表示扩展正则表达式,以便\w{9}可以根据需要运行。

答案 2 :(得分:1)

您的文件似乎是基于列的。您还可以使用awk正则表达式匹配第一列。

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