Возможно, вас заинтересует BioAwk , это адаптированная версия awk, настроенная для обработки файлов fasta
bioawk -c fastx -v seq1="pattern1" -v seq2="pattern2" \
'($seq ~ seq1) && ($seq ~ seq2) { print ">"$name; print $seq }' file.fasta
Если вы хотите seq1
в начале и seq2
в конце вы можете изменить его на:
bioawk -c fastx -v seq1="pattern1" -v seq2="pattern2" \
'($seq ~ "^"seq1) && ($seq ~ seq2"$") { print ">"$name; print $seq }' file.fasta
Это действительно удобно для обработки файлов fasta, так как часто последовательность разбивается на несколько строк.Приведенный выше код обрабатывает это очень легко, поскольку переменная $seq
содержит полную последовательность.
Если вы не хотите устанавливать BioAwk, вы можете использовать следующий метод для обработки файла FASTA.Он допускает многострочные последовательности и выполняет следующие действия:
- читает по одной записи за раз (это предполагает отсутствие
>
в заголовке, кроме первого символа) - извлечь заголовок из записи и сохранить его в
name
(на самом деле не нужно) - объединить всю последовательность в одну строку символов, удалив все символы новой строки и пробелы.Это гарантирует, что поиск
pattern1
или pattern2
не завершится неудачей, если шаблон разбит на несколько строк. - , если совпадение найдено, напечатайте запись.
следующий awk выполняет запрошенный запрос:
awk -v seq1="pattern1" -v seq2="pattern2" \
'BEGIN{RS=">"; ORS=""; FS="\n"}
{ seq="";for(i=2;i<=NF;++i) seq=seq""$i; gsub(/[^a-zA-Z0-9]/,"",seq) }
(seq ~ seq1 && seq ~ seq2){print ">" $0}' file.fasta
Если заголовок записи содержит другие символы >
, которые не находятся в начале строки, вы должны использовать немного другой подход (если вы не используете GNU awk)
awk -v seq1="pattern1" -v seq2="pattern2" \
'/^>/ && (seq ~ seq1 && seq ~ seq2) {
print name
for(i=0;i<n;i++) print aseq[i]
}
/^>/ { seq=""; delete aseq; n=0; name=$0; next }
{ aseq[n++] = $0; seq=seq""$0; sub(/[^a-zA-Z0-9]*$/,"",seq) }
END { if (seq ~ seq1 && seq ~ seq2) {
print name
for(i=0;i<n;i++) print aseq[i]
}
}' file.fasta
примечание: здесь мы используем sub
в случае, если в файле fasta введены непредвиденные символы (например, пробелы / табуляции или CR
(\r
))
Примечание: BioAwk основан на awk Брайана Кернигана , который задокументирован в "Языке программирования AWK"Аль Ахо, Брайаном Керниганом и Питером Вайнбергером (Addison-Wesley, 1988, ISBN 0-201-07981-X) .Я не уверен, что эта версия совместима с POSIX .