Фильтровать выравнивания, где есть два совпадения строк между символом _ и / - PullRequest
1 голос
/ 04 марта 2020

У меня есть набор файлов выравнивания, которые выглядят следующим образом:

>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                       

Код возвращается без значения.

Ответы [ 2 ]

1 голос
/ 04 марта 2020

С gawk вы можете сделать:

$ awk -v RS=$'>' '{
                   cnt=patsplit($0, arr, "_[^/]+") 
                   if (cnt==2 && arr[1]==arr[2]) 
                        printf ">%s", $0
                  }' test.fasta   
1 голос
/ 04 марта 2020

Вам просто нужно удалить равенство из регулярного выражения во второй строке:

match($0,/_[A-Z]+/){
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...