Замените заголовки fasta командой sed - PullRequest
0 голосов
/ 13 марта 2020

У меня есть файл fasta, который выглядит следующим образом.

>header1  
ATGC....  
>header2  
ATGC...

Мой список файлов выглядит так

organism1  
organism2

и содержит список организмов, которые я хочу заменить заголовком с.

Я пытался использовать for l oop, используя команду sed, которая выглядит следующим образом:

for i in `cat list7b`; do sed "s/^>/$i/g" sequence.fa; done

, но она не работает, пожалуйста, скажите, как я могу выполнить эту задачу.

Файл результатов должен выглядеть следующим образом:

>organism1  
ATGC...  
>organism2  
ATGC....

, то есть >header1 заменен на >organism_1 и т. д.

  1. Два Заголовки отличаются от ATG C, поскольку заголовок всегда начинается с > больше знака, тогда как ATG C - нет. Вот как они отличаются.
  2. Строки заголовка должны быть заменены на порядок появления, т.е. первая header* заменяется первой строкой из файла, 2-й заголовок - второй и т. Д.

I также попросите объяснить логи c, если это возможно. заранее спасибо.

1 Ответ

0 голосов
/ 13 марта 2020

С awk это легко сделать за один проход.

Предполагается, что ваш файл фаста называется sequence.fa, а файл списка организмов - list7b, как в вопросе, который вы можете использовать

awk 'NR == FNR { o[n++] = $0; next } /^>/ && i < n { $0 = ">" o[i++] } 1' list7b sequence.fa > output.fa

Объяснение:

NR == FNR - условие для выполнения действий только с первым файлом. (общее количество записей равно количеству записей в текущем файле)

{ o[n++] = $0; next } помещает строку ввода в массив o, подсчитывает записи и пропускает дальнейшую обработку строки ввода, поэтому o будет содержать все строки вашего организма.

Следующая часть выполняется для остальных файлов.

/^>/ && i < n действительна для строк, которые начинаются с > до i меньше числа элементов n, которые были помещены в массив o.

{ $0 = ">" o[i++] } заменяет текущую строку на >, за которой следует элемент массива (то есть строка из первого файла ) и увеличивает индекс i до следующего элемента.

1 - это условие «всегда верно» с неявным действием по умолчанию { print } для печати текущей строки для каждой строки ввода.

...