Это ваш сценарий awk
:
/^>/ {
print s ? s "\n" $0 : $0;
s = "";
next;
}
{
s = s sprintf("%s", $0);
}
END {
if (s)
print s;
}
Первый блок запускается только для строк, начинающихся с >
, т.е. строки заголовка фаста.
В первом блоке что-то печатается. Это что-то s? s "\ n" $ 0: $ 0
. Это означает, что «если s
не равно нулю (или не задано), используйте s
и добавьте к нему новую строку, за которой следует вся текущая строка, в противном случае просто используйте всю текущую строку ". В этой программе s
будет частично прочитанной последовательностью, принадлежащей последней обработанной строке заголовка, и когда программа попадает в строку заголовка, этот оператор print
выводит последнюю последовательность ( которая теперь завершена), если таковая была, а затем новая строка заголовка на новой строке.
Затем блок устанавливает s
в пустую строку (мы еще не читали никакой последовательности, принадлежащей этому заголовку), и мы переходим к следующей строке ввода.
Следующий блок выполняется для всех строк ввода (но не для строк заголовка, поскольку они будут пропущены из-за следующего
в предыдущем блоке). Он просто добавляет текущую строку к s
.Используется sprintf
, но я не совсем уверен, почему ( s = s $ 0
, вероятно, тоже будет работать).
Последний блок будет выполнен после прочтения всех строк ввода. Он напечатает последовательность, принадлежащую последней строке заголовка, если таковая была.
Резюме:
Сценарий awk
объединяет все отдельные строки последовательности, сохраняя их в переменной. Когда строка заголовка найдена, он выводит прочитанную последовательность вместе с новым заголовком в отдельной строке. В конце выводится последовательность, принадлежащая последнему заголовку.
Альтернативный сценарий awk
, который не сохраняет последовательность в переменной (может быть полезно, если у вас очень большие геномы в ваших файлах fasta):
/^>/ {
if (NR == 1) {
print; # 1st header line, just print it.
} else {
# Print a newline for the prev. sequence, then the header line on its own line.
printf("\n%s\n", $0);
}
next; # Skip to next input line.
}
{
printf("%s", $0); # Print sequence without newline.
}
END {
printf("\n"); # Add final newline to output.
}
В качестве «однострочного»:
awk '/^>/{if(NR==1){print}else{printf("\n%s\n",$0)}next} {printf("%s",$0)} END{printf("\n")}' sequence.fasta