这是我的第一篇文章。我想写一个小脚本来计算一行中的多个唯一重复。文本是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
非常感谢你的帮助。一切顺利,贝尔纳多
答案 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
工作原理:
-n
标记,对来自stdin
@strings
是我们感兴趣的字符串列表@strings
中的每个项目,我们会计算匹配项
$s
具有AG
,GA
,CT
,TC
(?<!$s)($s){3}(?!$s)
匹配3个连续的$s
$s
,后面没有$s
,而不是(?<!$e)($s){3}(?!$b)
$s
匹配3个连续的$s
,后面没有$s
的第1个字符,后面没有$x =~ m///g
的第2个字符scalar(@matches)
返回所有匹配项的数组