Filter 使用grep过滤同步条件

Filter 使用grep过滤同步条件,filter,grep,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 [itemtoremo

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

  • 少于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哪里出了问题吗? 它向我输出一个空白文件。
谢谢

您可以使用正则表达式的
perl
风格,使用
[[:alpha:]
组中的字符,并使用
^
$
锚定匹配以开始和结束行:

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

abaca
abradant
abrasive

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

grep '^[a-z][a-z][a-z][a-z]*$' infile
对于“升级的问题”,以下内容从指定的输入生成指定的输出(对我的浏览器中显示的空白进行一些假设)

这个正则表达式正好包含两个空白字符,它们是制表符

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

这是一个有趣的巧合:

  • 所需的所有行的第一列项目都以“-n”xcompile结尾
  • 同上,第二列项目以“如-”开头
  • 这些是唯一指定下划线或连字符的位置
因此,您可能希望表达式更像这样:

grep '^[a-z][a-z][a-z][a-z]*-n  such_as-[a-z]*  [0-9]\.[0-9]*   [A-Z]$' input
现在我注意到了其他巧合,比如“hea”作为“such_as-”后面的单词的开头。但也许现在这就足够了?

这是可行的:

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

为什么输出中排除了abradant?人为错误:检查示例中的编辑。如果我只想将此grep应用于4个选项卡分隔列中的第1列。如何修改此命令以产生所需的结果?上面的问题已经用完整详细的问题进行了修改。
egrep  -v "[^a-zA-Z]" infile | egrep "[a-zA-Z]{3,}" > outfile