Понимание формулы awk, которая разворачивает файлы fasta

Можно добавить несколько строк LocalForward :

Host myhost
    Hostname 123.123.123.123
    IdentityFile ~/.ssh/id_myhost
    LocalForward 8811 localhost:8811
    LocalForward 6006 localhost:6006
    IdentitiesOnly yes

Это то, что вы хотите?

{{1} }
3
20.04.2019, 18:10
2 ответа

FWIW предоставил решение на основе "sed" для обернутых файлов fasta. Базовый поток метода sed заключается в нахождении строки имени последовательности, сначала мы отображаем эту строку в отдельной строке, а затем начинаем накапливать в пространстве шаблона строки последовательности, а также удаляем новую строку по мере продвижения. Этот поток прерывается, когда мы нажимаем на следующую строку имени последовательности или eof.

sed -e '
  /^>/{                  # caught sequence name line
     n                   # print seq name, next line into pattern space
     :loop
        N                # read next line into PS, if not print PS/quit
        /\n>/!s/\n//     # join successive sequences
     /\n/!bloop          # go back for more seq if new seq name not got yet
     P;D                 # print the current seq then delete it, branch to the top with PS having new seq name
  }
' your_fasta_file
0
27.01.2020, 21:15

Это ваш сценарий 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
5
27.01.2020, 21:15

Теги

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