Это адаптация превосходного решения Джеймса Брауна .Адаптация делает его совместимым с POSIX, а также исправляет один случай, когда два значения F
находятся на расстоянии менее 5 символов.Пример:
...RQCSWFAGFCTNRQS...
^ ^
Первое окно должно обнаружить RQCSWFAGFCT
, в то время как второе окно должно обнаружить SWFAGFCTNRQ
.В предлагаемом решении он будет обнаруживать только AGFCTNRQ
, или он может вообще не обнаружить второй F
.(в зависимости от использования .{0,5}F.{0,5}
или .{5}F.{0,5}
в качестве регулярного выражения.
awk '
NR%2 {print; next } # print every odd record
{ # the even records are processed
seq=$0; l=lseq=length($0)
while(match(seq,/F/)) { # find `F`
n = l - lseq + RSTART # get position in $0
print s=substr($0,n-5,(n<6?n+5:11)), # print match and
# correct if F is in the first 5
gsub(/E/,"E",s), # count of Es
gsub(/D/,"D",s) # count of Ds
seq=substr(seq,RSTART+1) # shorten the search string
lseq=lseq-RSTART
}
}' file.fasta
Вас также может заинтересовать BioAwk , это адаптированная версия awk, которая настроенадля обработки файлов FASTA.
Это дает результат:
bioawk -c fastx '{ print ">" $name }
{ tmp=$seq; l=ltmp=length($seq)
while(match(tmp,/F/)) {
n=l-ltmp+RSTART
print s=substr($seq,n,(n<6?n+5:11)),
gsub(/E/,"E",s),
gsub(/D/,"D",s)
tmp=substr(tmp,RSTART+1)
ltmp=ltmp-RSTART
}}' file.fasta
Здесь $name
- имя последовательности (все после >
), а $seq
- полная последовательность,даже если у вас есть последовательность, охватывающая несколько строк.
Примечание: BioAwk основан на awk Брайана Кернигана , который задокументирован в «Язык программирования AWK», Аль Ахо, Брайан Керниган и Питер Вайнбергер (Addison-Wesley, 1988, ISBN 0-201-07981-X) . Я не уверен, совместима ли эта версияс POSIX .