我有一个细菌分类分配的文本文件,如下所示(数字表示不同的细菌):
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)并尝试,
grep -v "s__" file但是,由于所有的分配都包含s__,所以我得到了回复(它排除了它们,我猜..)。
我在最后尝试过使用*,就像在s__*中一样,但是它也不起作用。
我想要的是,应用一个命令,得到一行细菌和数量的细菌与物种分配。
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发布于 2015-04-22 15:52:41
只需让grep在s__不是行尾后匹配任何字符(用$表示):
$ 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的方法将计数器值存储到数组中:
$ 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为了检查文件的末尾是否出现了这种情况,我们需要额外的检查:
grep -E 's__[^ $]+$' file
awk '/s__[^ $]+$/ {a[$0]++} END {for (i in a) print a[i], i}' file他们检查在s__之后至少有一组字符不是空格或行尾。然后,排到最后。
更新
谢谢,效果很好!有什么方法可以把所有的行进行汇总,这样我才能知道我总共有多少个非"s__“的计数?- Isa
当然,只需添加print length(a)以查看数组中有多少元素:
$ 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
2https://stackoverflow.com/questions/29802086
复制相似问题