2013-09-28 49 views
1

這是我的第一篇文章。我想寫一個小腳本來統計一行中的多個獨特重複。該文本是一個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 

非常感謝您的幫助。一切順利,Bernardo

回答

1

我認爲您的描述和示例輸入和輸出中存在一些不一致之處。所以這個劇本可能不是完美的,但我希望它涉及足夠接近,你可以計算出其餘:

./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 

#!/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"; 

你可以使用它

它提供:

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值,GACTTC
    • 表達(?<!$s)($s){3}(?!$s)匹配的3個連續$s其後面沒有$s而不是由$s
    • 表達之前(?<!$e)($s){3}(?!$b)匹配的3個連續$s未隨後的$s的第一字符而不是由$s
    • 的第二字符之前
    • $x =~ m///g返回所有匹配的數組
    • scalar(@matches)是所有比賽的數組的大小的操作,我們把它添加到計數
+0

嗨janos。當然,Sequence_3必須有零個計數。雖然它包含字符串(GA)3,但它同時位於(AG)4內,因此不應該算作正數。對不起,如果我沒有足夠的重點! – biotech

+0

我修改了腳本,爲您的輸入生成所需的輸出。但我不確定它處理所有的角落案件。測試一下,如果你發現一個處理不當的情況,那麼更新你的問題中的樣本。 – janos

+0

嗨janos,我添加了序列8和9.由於一個角的後面跟着$ s的第一個字符或之前是$ s的第二個字符,因此計數爲負數。我們應該修改腳本以容忍這種情況之一,但不能同時處理這兩種情況。那是對的嗎? – biotech

相關問題