2

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

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

4

3 回答 3

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-”之后。但也许这已经足够了?

于 2013-10-15T08:05:52.470 回答
2

这有效:

egrep  -v "[^a-zA-Z]" infile | egrep "[a-zA-Z]{3,}" > outfile
于 2013-10-15T08:06:50.033 回答
1

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

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

它产生:

abaca
abradant
abrasive
于 2013-10-15T08:03:19.453 回答