计算一行中的多个唯一字符串

时间:2013-09-28 10:38:23

标签: awk count line unique repeat

这是我的第一篇文章。我想写一个小脚本来计算一行中的多个唯一重复。文本是DNA序列enter link description here,因此文本将是四个字母的组合:A,T,G和C. 如果一个字符串出现两次,它将被计数两次,依此类推。

我想要寻找的唯一字符串是三个AG,GA,CT或TC的重复,分别是(AG)3,(GA)3,(CT)3和(TC)3。我不希望程序计算四个或更多的重复。

要计算的字符串:

AGAGAG
GAGAGA
CTCTCT
TCTCTC

示例输入文件(由选项卡分隔的两列):

Sequence_1    AGAGAG                   
Sequence_2    AGAGAGT                  
Sequence_3    AGAGAGAG                 
Sequence_4    AGAGAT                   
Sequence_5    AGAGAGAGAGAGAGAGAGT      
Sequence_6    AGAGAGTAGAGAG 
Sequence_7    CTCTCTCTCTC  
Sequence_8    TAGAGAGAT                
Sequence_9    TAAGAGAGAAG              

期望的输出:

Sequence_1    AGAGAG                   1
Sequence_2    AGAGAGT                  1
Sequence_3    AGAGAGAG                 0
Sequence_4    AGAGAT                   0
Sequence_5    AGAGAGAGAGAGAGAGAG       0
Sequence_6    AGAGAGTAGAGAG            2
Sequence_7    CTCTCTCTCTCAAGAGAG       1 
Sequence_8    TAGAGAGAT                1
Sequence_9    TAAGAGAGAAG              1

我有一个用awk编写的小内容,但我认为匹配字符串时并不具体:

awk '{if($1 ~ /AGAGAG/)x++; if($1 ~ /TCTCTC/)x++;if($1 ~ /GAGAGA/)x++;if($1 ~ /CTCTCT/)x++;print x;x=0}' inputfile.tab

非常感谢你的帮助。一切顺利,贝尔纳多

1 个答案:

答案 0 :(得分:1)

我认为您的描述以及示例输入和输出中存在一些不一致之处。所以这个剧本可能并不完美,但我希望它足够接近,你可以弄清楚其余部分:

#!/usr/bin/perl -n

my ($seq, $dna) = split(/\s+/);
my @strings = qw/AG GA CT TC/;
my $count = 0;
foreach my $s (@strings) {
    my ($b, $e) = split(//, $s);
    @matches = $dna =~ m/(?<!$e)($s){3}(?!$b)/g;
    $count += scalar(@matches);
}
print join("\t", $seq, sprintf("%-20s", $dna), $count), "\n";

您可以将其用于:

./script.pl < sample.txt

输入:

Sequence_1    AGAGAG
Sequence_2    AGAGAGT
Sequence_3    AGAGAGAG
Sequence_4    AGAGAT
Sequence_5    AGAGAGAGAGAGAGAGAGT
Sequence_6    AGAGAGTAGAGAG
Sequence_7    CTCTCTCTCTCAAGAGAG

它给出了:

Sequence_1    AGAGAG                1
Sequence_2    AGAGAGT               1
Sequence_3    AGAGAGAG              0
Sequence_4    AGAGAT                0
Sequence_5    AGAGAGAGAGAGAGAGAGT   0
Sequence_6    AGAGAGTAGAGAG         2
Sequence_7    CTCTCTCTCTCAAGAGAG    1

工作原理:

  • 感谢shebang中的-n标记,对来自stdin
  • 的每一行执行脚本
  • @strings是我们感兴趣的字符串列表
  • 对于@strings中的每个项目,我们会计算匹配项
    • $s具有AGGACTTC
    • 的值
    • 表达式(?<!$s)($s){3}(?!$s)匹配3个连续的$s $s,后面没有$s,而不是(?<!$e)($s){3}(?!$b)
    • 表达式$s匹配3个连续的$s,后面没有$s的第1个字符,后面没有$x =~ m///g的第2个字符
    • 操作scalar(@matches)返回所有匹配项的数组
    • {{1}}是所有匹配数组的大小,我们将其添加到计数