bash-在文件中搜索字符串并返回所有匹配的位置

时间:2014-10-21 22:09:42

标签: bash awk sed grep fasta

我有一个fasta file_imagine作为txt文件,其中偶数行是字符序列,奇数行是序列id's_我想在序列中搜索字符串并获取匹配子字符串的位置以及它们的id 。例: 输入:

>111
AACCTTGG
>222
CTTCCAACC
>333
AATCG

搜索“CC”。输出:

3 111
4 8 222

2 个答案:

答案 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的每个值。

    最后,我们打印匹配位置bid

答案 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