2014-10-21 96 views
0

我有一個fasta file_imagine作爲txt文件,其中偶數行是字符序列,奇數行是序列id's_我想要搜索串中的字符串並獲取匹配子字符串以及它們的ID的位置。示例: 輸入:bash-搜索文件中的字符串並返回所有匹配的位置

>111 
AACCTTGG 
>222 
CTTCCAACC 
>333 
AATCG 

搜索「CC」。輸出:

3 111 
4 8 222 

回答

1
$ awk -F'CC' 'NR%2==1{id=substr($0,2);next} NF>1{x=1+length($1); b=x; for (i=2;i<NF;i++){x+=length(FS $i); b=b " " x}; print b,id}' file 
3 111 
4 8 222 

說明:

  • -F'CC'

    AWK場所輸入線到字段。我們指示它在本例中使用感興趣的序列CC作爲字段分隔符。

  • NR%2==1{id=substr($0,2);next}

    在奇數行中,我們將ID變量id。假設是第一個字符是>,而id是什麼後面的。捕獲了id後,我們指示awk跳過剩餘的命令並從next行開始。

  • NF>1{x=1+length($1); b=x; for (i=2;i<NF;i++){x+=length(FS $i); b=b " " x}; print b,id}

    如果AWK發現上的輸入線只有一個字段,NF==1,這意味着,有沒有發現字段分隔符,我們忽略這些行。

    對於其餘的行,我們計算每個匹配的位置x,然後保存在字符串b中找到的每個值x

    最後,我們打印匹配位置bid

0

將打印行號和每個匹配的每個開始位置。

awk 'NR%2==1{t=substr($0,2)}{z=a="";while(y=match($0,"CC")){a=a?a" "z+y:z+y;$0=substr($0,z=(y+RLENGTH));z-=1}}a{print a,t }' file 

整潔

awk ' 
NR%2==1{t=substr($0,2)} 
    { 
    z=a="" 
    while (y = match($0,"CC")) { 
     a=a?a" "z+y:z+y 
     $0=substr($0,z=(y+RLENGTH)) 
     z-=1 
    } 
} 
a { print a,t }' file 

3 111 
4 8 222 
相關問題