如何计算一行中模式的出现


8

我有一个包含三列的文件。第3列包含基因名称,看起来像这样:

Rv0729,Rv0993,Rv1408  
Rv0162c,Rv0761c,Rv1862,Rv3086  
Rv2790c

如何打印每一行中的基因数量?


第四栏?如果该列已被占用(示例中的第二行),或者其他列为空(最后一行),该怎么办?
库萨兰达

@Kusalananda从我的查询中删除了该标准:)
Saisha

快速查看,所有答案都将逗号分隔的字段或与Rv*模式匹配的字符串计算在行中的任何位置,而不仅是在特定列中。因此,我只是要注意,如果文件中确实有其他数据(此处的问题未提供),则可能需要相应地修改解决方案。(或澄清问题。)
ilkkachu

Answers:


10

您只想添加一个包含列数的列。这可以使用awk

$ awk -F ',' '{ printf("%d,%s\n", NF, $0) }' data.in
3,Rv0729,Rv0993,Rv1408
4,Rv0162c,Rv0761c,Rv1862,Rv3086
1,Rv2790c

NF是一个awk变量,包含当前记录(行)中的字段(列)数。我们为每行打印此数字,后跟逗号和该行的其余部分。

另一种选择(相同的结果,但看起来可能更干净):

$ awk -F ',' 'BEGIN { OFS=FS } { print NF, $0 }' data.in

FSawk用于将每个记录分成多个字段的字段分隔符,我们-F ','在命令行上将其设置为逗号(与第一个解决方案一样)。OFS输出字段分隔符,我们将其设置为与FS读取输入的第一行之前相同。


5

如果您想计算Rv[0-9]{4}c?模式出现的次数,而不是问题所提示的逗号分隔字段的数目,则可以执行以下操作:

 awk '{print gsub(/Rv[0-9]{4}c?/, "&"), $0}'

4

Perl方法:

$ perl -F, -pae 's/^/$#F+1 . ","/e' file
3,Rv0729,Rv0993,Rv1408  
4,Rv0162c,Rv0761c,Rv1862,Rv3086  
1,Rv2790c

-a品牌perl表现得像awk和分裂上由下式给出的串中的每个输入线-F和保存生成的字段到阵列@F。因此,$#F将是中的最高数组索引,@F并且由于数组从开始计数0$#F+1将是数组中元素的总数。的-p意思是“由aplpying给出的脚本后打印每个输入线-e。该s///是替换操作符和这里进行了更换的线(的开头^)与字段的+ 1的数目和逗号($#F+1 . ",")。


1

您的问题指出第3列包含基因名称。我假设您的实际输入如下:

column1 column2 Rv0729,Rv0993,Rv1408  
column1 column2 Rv0162c,Rv0761c,Rv1862,Rv3086  
column1 column2 Rv2790c

column3中的每个基因名称均包含前导Rv子字符串。因此我们可以这样在python中对它们进行计数:

$ python -c  "import sys;print map(lambda x: x.split()[2].count('Rv'),sys.stdin.readlines())"  < input.txt               
[3, 4, 1]

产生的列表按其各自的顺序显示了每个品系中的基因计数。如果我们想使其更为冗长,并考虑基因可能不包含“ Rv”字符串的可能性(但要假设column3是逗号分隔的值字符串),我们还可以执行以下操作:

#!/usr/bin/env python
import sys
with open(sys.argv[1]) as fd:
    for index,line in enumerate(fd):
        columns = line.strip().split()
        num_genes=len(columns[2].split(","))
        print("Line "+str(index)+" contains "+str(num_genes))

测试运行:

$ ./count_genes.py input.txt                                                                                             
Line 0 contains 3
Line 1 contains 4
Line 2 contains 1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.