Самый простой способ обработки файлов FASTA с помощью awk - это создать переменную с именем name
и переменную с именем seq
. Каждый раз, когда вы читаете полную последовательность, вы можете обработать ее. Заметьте, что для лучшего способа обработки последовательность должна храниться как непрерывная строка и не должна содержать никаких новых строк или пробелов. Общий c awk для обработки fasta, выглядит следующим образом:
awk '/^>/ && seq { process_sequence_here }
/^>/{name=$0; seq=""; next}
{seq = seq $0 }
END { process_sequence_here }' file.fasta
Вы можете сделать это немного проще, введя несколько функций:
awk '/^>/ && seq { process_sequence(name_seq) }
/^>/{name=substr($0,2); seq=""; next}
{seq = seq $0 }
END { process_sequence(name,seq) }
BEGIN{seq_ere=sprintf("%80s","");gsub(" ",".",seq_ere) }
function print_sequence(name,seq) {
gsub(seq_ere,"&" ORS, seq); print ">" name ORS seq
}
function process_sequence(name,seq) { ... }
' file.fasta
В случае OP, приведенное выше будет выглядеть так:
awk '(NR==FNR) { a[$0]; next }
/^>/ && seq { process_sequence(name_seq) }
/^>/{name=substr($0,2); seq=""; next}
{seq = seq $0 }
END { process_sequence(name,seq) }
BEGIN{seq_ere=sprintf("%80s","");gsub(" ",".",seq_ere) }
function print_sequence(name,seq) {
gsub(seq_ere,"&" ORS, seq); print ">" name ORS seq
}
function process_sequence(name,seq) {
$0=name; if ($1 in a) print_sequence (name,seq)
}
' list.txt file.fasta
Когда вы обрабатываете fasta-файлы с помощью awk, вы всегда можете использовать bioawk . Он имеет все навороты из POSIX awk, но дополнен для простой обработки файлов FASTA:
Примечание: BioAwk основан на awk Брайана Кернигана , который задокументирован в "Языке программирования AWK" Аль Ахо, Брайана Кернигана и Питера Вайнбергера (Addison-Wesley, 1988, ISBN 0-201-07981-X) . Я не уверен, что эта версия совместима с POSIX .