首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检索只在结尾处包含特定字符串的文本行,而不是在之间的某个位置检索行。

检索只在结尾处包含特定字符串的文本行,而不是在之间的某个位置检索行。
EN

Stack Overflow用户
提问于 2015-04-22 15:24:11
回答 1查看 42关注 0票数 0

我有一个细菌分类分配的文本文件,如下所示(数字表示不同的细菌):

代码语言:javascript
复制
1130952 k__Bacteria; p__Acidobacteria; c__Acidobacteriia; o__Acidobacteriales; f__Acidobacteriaceae; g__Edaphobacter; s__modestum
555445  k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Clostridium; s__fimetarium
325910  k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__; s__
744205  k__Bacteria; p__Proteobacteria; c__Deltaproteobacteria; o__; f__; g__; s__

许多细菌没有分类到物种水平,所以他们缺乏信息:"s__“。我希望看到有这种信息的细菌(就像上面两种细菌一样,一个是"s__modestum“,另一个是"s__fimetarium")。我正在使用mac终端(MacOSX10.9.5)并尝试,

代码语言:javascript
复制
grep -v "s__" file

但是,由于所有的分配都包含s__,所以我得到了回复(它排除了它们,我猜..)。

我在最后尝试过使用*,就像在s__*中一样,但是它也不起作用。

我想要的是,应用一个命令,得到一行细菌和数量的细菌与物种分配。

代码语言:javascript
复制
1 1130952 k__Bacteria; p__Acidobacteria; c__Acidobacteriia; o__Acidobacteriales; f__Acidobacteriaceae; g__Edaphobacter; s__modestum
1 555445    k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Clostridium; s__fimetarium
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-22 15:52:41

只需让greps__不是行尾后匹配任何字符(用$表示):

代码语言:javascript
复制
$ grep 's__[^$]' file
1130952 k__Bacteria; p__Acidobacteria; c__Acidobacteriia; o__Acidobacteriales; f__Acidobacteriaceae; g__Edaphobacter; s__modestum
555445  k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Clostridium; s__fimetarium

要获得与此条件匹配的行数,需要使用类似于awk的方法将计数器值存储到数组中:

代码语言:javascript
复制
$ awk '/s__[^$]/ {a[$0]++} END {for (i in a) print a[i], i}' file
1 555445  k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Clostridium; s__fimetarium
1 1130952 k__Bacteria; p__Acidobacteria; c__Acidobacteriia; o__Acidobacteriales; f__Acidobacteriaceae; g__Edaphobacter; s__modestum

为了检查文件的末尾是否出现了这种情况,我们需要额外的检查:

代码语言:javascript
复制
grep -E 's__[^ $]+$' file
awk '/s__[^ $]+$/ {a[$0]++} END {for (i in a) print a[i], i}' file

他们检查在s__之后至少有一组字符不是空格或行尾。然后,排到最后。

更新

谢谢,效果很好!有什么方法可以把所有的行进行汇总,这样我才能知道我总共有多少个非"s__“的计数?- Isa

当然,只需添加print length(a)以查看数组中有多少元素:

代码语言:javascript
复制
$ awk '/s__[^ $]+$/ {a[$0]++} END {for (i in a) print a[i], i; print length(a)}' a
1 555445  k__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Clostridium; s__fimetarium
1 1130952 k__Bacteria; p__Acidobacteria; c__Acidobacteriia; o__Acidobacteriales; f__Acidobacteriaceae; g__Edaphobacter; s__modestum
2
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29802086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档