【问题标题】:Filter alignments where there are two string matches between character _ and /过滤字符 _ 和 / 之间有两个字符串匹配的对齐方式
【发布时间】:2020-03-04 08:32:02
【问题描述】:

我有一组如下所示的对齐文件:

>X2JE30_DROME/180-423|W6URD5_ECHGR/38-170
.........AEGYPVDLYYLMDLSKSM...E..DDKAK..LST....LG.D......K....L......
>X2JE30_DROME/180-410|X1WIK5_DROME/68-211
......AEGYPVDLYYLMDLSKSM...E..DDKAK..LST....LG.D......K....L.........
>X2dhs0_ECHGR/183-490|X1WIK5_ECHGR/68-211
.......AEGYPVDLYYLMDLSKSM...E..DDKAK..LST....LG.D......K....L........

如何获得以下输出,其中只有在 _ 和 / 之间的两个字符串之间存在匹配时才会打印序列:

期望的输出

>X2JE30_DROME/180-410|X1WIK5_DROME/68-211
......AEGYPVDLYYLMDLSKSM...E..DDKAK..LST....LG.D......K....L.........
>X2dhs0_ECHGR/183-490|X1WIK5_ECHGR/68-211
.......AEGYPVDLYYLMDLSKSM...E..DDKAK..LST....LG.D......K....L........

我已经尝试了以下代码:

awk '                               
match($0,/_=[A-Z]+/){              
  val=substr($0,RSTART,RLENGTH)    
  if(gsub(val,"&")==2){            
    print                           
    found=1                         
  }
  val=""                            
  next                              
}
found{                              
  found=""                          
  print                            
}
' test.fasta                       

代码返回没有值。

【问题讨论】:

  • awk 脚本改编自 stackoverflow.com/a/60498903/8133920>。
  • 你有 GNU awk 还是 POSIX awk?
  • @Quasímodo 同意

标签: shell unix awk


【解决方案1】:

您只需要从第二行的正则表达式中删除等于:

match($0,/_[A-Z]+/){

【讨论】:

    【解决方案2】:

    使用gawk,您可以:

    $ awk -v RS=$'>' '{
                       cnt=patsplit($0, arr, "_[^/]+") 
                       if (cnt==2 && arr[1]==arr[2]) 
                            printf ">%s", $0
                      }' test.fasta   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-28
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      相关资源
      最近更新 更多