【问题标题】:bash- searching for a string in a file and returning all the matching positionsbash- 在文件中搜索字符串并返回所有匹配的位置
【发布时间】:2014-10-22 23:04:15
【问题描述】:

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

>111
AACCTTGG
>222
CTTCCAACC
>333
AATCG

搜索“抄送”。输出:

3 111
4 8 222

【问题讨论】:

    标签: bash awk sed grep fasta


    【解决方案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。假设是第一个字符是 &gt; 并且 id 是后面的任何内容。捕获 id 后,我们指示 awk 跳过剩余的命令并从 next 行重新开始。

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

      如果 awk 在输入行中仅找到一个字段 NF==1,则表示未找到字段分隔符,我们将忽略这些行。

      对于其余的行,我们计算每个匹配项在x 中的位置,然后保存在字符串b 中找到的每个x 值。

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

    【讨论】:

      【解决方案2】:

      将打印每个匹配的行号和每个开始的位置。

      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
      

      【讨论】:

        猜你喜欢
        • 2013-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-15
        • 2016-02-02
        • 1970-01-01
        • 2023-03-08
        • 2021-09-15
        相关资源
        最近更新 更多