Вы можете легко сделать это в awk:
awk '{ if(/^>/){name=$0; sub(/^>/,"", name);}{print >> name".fa"}}' file.fa
Это будет перебирать всю строку входного файла, и, если первый символ будет >
, он сохранит эту строку как name
. Затем он удалит >
из содержимого name
, так как вы не хотите, чтобы это было в имени файла. Наконец, каждая строка добавляется в файл с именем name.fa
, где name
— это имя текущей последовательности.
Если вы хотите распечатать только те последовательности, в которых больше N строк, вы можете использовать:
awk -v min=4 '{
if(/^>/){
if(num >= min){
print seq >> name".fa"
}
name=$0;
sub(/^>/,"", name);
seq=$0;
num=0
}
else{
seq = seq"\n"$0;
num++
}
}
END{
if(num >= min){
print seq >> name".fa"
}
}' file.fa
Как правило, не используйте циклы оболочки для обработки текста . Они медленные, громоздкие и подвержены ошибкам.