使用grep过滤同时标准

时间:2013-10-15 07:51:09

标签: filter grep

我需要创建一个过滤器,可以过滤掉任何字符串:

  • 少于3个字符
  • 包含数字或符号(即任何不是拉丁字母中的项目的内容)

实施例: 输入文件:

5-hydroxy-3-methylglutaryl-coenzyme_a_reductase
5-hydroxytryptamine
a
a
a
aa
abaca
abo_antibodies
abradant
abrasive

输出文件:

abaca
abradant
abrasive

我一直在关注grep选项:

grep -v [itemtoremove] [inputfile] > [outputfile]

似乎可以解决问题。但是,它只会单独删除每个项目,这意味着要从文件中删除我需要的所有内容,我将不得不连续运行此脚本。

有没有人有解决方案,以便我可以使用一个grep(或其他更有效的命令行)过滤所需的所有内容?

更新的问题

下面有几个很好的解决方案可以解决这个问题。

但是,我想将其应用于具有4个制表符分隔列的输入文件。

我尝试过以下修改:

grep '^[a-z][a-z][a-z][a-z]-n$' input

输入现在如下:

a-n such_as-handheld-n  6.4623  A
abaca-n such_as-head-n  2.5586  A
abo_antibodies-n    such_as-headphone-n 8.0794  A
abrasive-n  such_as-healthcare-n    5.2845  A
function-n  such_as-hearing-n   9.5367  A

我们想要以下输出:

abaca-n such_as-head-n  2.5586  A
abrasive-n  such_as-healthcare-n    5.2845  A
function-n  such_as-hearing-n   9.5367  A

有人能告诉我修改后的grep出错了吗? 它输出一个空白文件。 谢谢!

3 个答案:

答案 0 :(得分:3)

对于问题的第一部分,以下几乎适用于任何grep。

grep '^[a-z][a-z][a-z][a-z]*$' infile

对于'升级问题',以下内容从指定的输入生成指定的输出(对我的浏览器中显示的空白做出一些假设)。

grep '^[a-z-][a-z-][a-z-][a-z-]*-n  [a-z_-]*-n  [0-9]\.[0-9]*   [A-Z]$' infile

此正则表达式恰好包含两个空白字符,即制表符。

由于指定的输入现在包含输出中所需的连字符和下划线,因此上面采用了一种处理连字符和下划线的简单方法。我对你想要如何处理第三和第四列做了一些猜测。

这是一个有趣的巧合:

  • 您想要的所有行都包含以'-n'xcompile
  • 结尾的第一列项目
  • 同样以'such_as - '
  • 开头的第二列项目
  • 这些是唯一指定下划线或连字符的地方

所以也许你希望表达式看起来更像这样:

grep '^[a-z][a-z][a-z][a-z]*-n  such_as-[a-z]*  [0-9]\.[0-9]*   [A-Z]$' input

现在我注意到其他巧合,比如'hea'重复出现在'such_as-'之后的单词的开头。但也许现在这已足够了?

答案 1 :(得分:2)

这有效:

egrep  -v "[^a-zA-Z]" infile | egrep "[a-zA-Z]{3,}" > outfile

答案 2 :(得分:1)

您可以使用正则表达式的perl风格,使用[[:alpha:]]组中的字符,并将匹配项定位到^$的开头和结尾处:

grep -P '^[[:alpha:]]{3,}$' infile

它产生:

abaca
abradant
abrasive