我有一个fasta file_imagine作为txt文件,其中偶数行是字符序列,奇数行是序列id's_我想在序列中搜索字符串并获取匹配子字符串的位置以及它们的id 。例: 输入:
>111
AACCTTGG
>222
CTTCCAACC
>333
AATCG
搜索“CC”。输出:
3 111
4 8 222
答案 0 :(得分: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
中计算每个匹配的位置,然后保存字符串x
中找到的b
的每个值。
最后,我们打印匹配位置b
和id
。
答案 1 :(得分: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