我需要创建一个过滤器,可以过滤掉任何字符串:
实施例: 输入文件:
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出错了吗? 它输出一个空白文件。 谢谢!
答案 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
此正则表达式恰好包含两个空白字符,即制表符。
由于指定的输入现在包含输出中所需的连字符和下划线,因此上面采用了一种处理连字符和下划线的简单方法。我对你想要如何处理第三和第四列做了一些猜测。
这是一个有趣的巧合:
所以也许你希望表达式看起来更像这样:
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