检索仅在末尾而不是中间某处包含特定字符串的文本行
Retrieve lines of a text that contain a certain string only in the end and not somewhere in between
我有一个细菌分类分配的文本文件,看起来像这样(数字表示不同的细菌):
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 终端(Mac OS X 10.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
只要求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[[=11=]]++} 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[[=12=]]++} END {for (i in a) print a[i], i}' file
他们检查在 s__
之后是否有一组至少一个字符不是 space 或行尾。然后,行尾。
更新
Thank you it worked great! Is there a way I can sum up all the lines
so I could know how many counts I have in total of the non "s__"? –
Isa
当然,只需添加print length(a)
即可查看数组有多少个元素:
$ awk '/s__[^ $]+$/ {a[[=13=]]++} 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
我有一个细菌分类分配的文本文件,看起来像这样(数字表示不同的细菌):
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 终端(Mac OS X 10.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
只要求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[[=11=]]++} 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[[=12=]]++} END {for (i in a) print a[i], i}' file
他们检查在 s__
之后是否有一组至少一个字符不是 space 或行尾。然后,行尾。
更新
Thank you it worked great! Is there a way I can sum up all the lines so I could know how many counts I have in total of the non "s__"? – Isa
当然,只需添加print length(a)
即可查看数组有多少个元素:
$ awk '/s__[^ $]+$/ {a[[=13=]]++} 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