исполняемый бит на файлах, созданных vim

Это ваш сценарий 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
1
11.10.2015, 23:28
0 ответов

Теги

Похожие вопросы