добавить тег в имя последовательности fastta - PullRequest
0 голосов
/ 17 октября 2019

Мне нужна помощь. У меня есть файл fasta, такой как:

>YP_00698.1 hypothetical protein sp [Species 1]
MDMQFGYFTRNPSTKYPATLYPREVSCALYEDDNENTSLIPKSRHYHYTIQPPINYKKLTNVDRYKNFRL

>YP_0098.1 hypothetical protein sp [Species 2]
MDMQFGYFTRNPSTKYPATLYPREVSCALYEDDNENTSLIPKSRHYHYTIQPPINYKKLTNVDRYKNFRL

>YP_009378.1 hypothetical protein sp [Species 3]
MEDNTAEDIIKNHLLNTSNDDDDDADSLKKKKENIDDIVKESKNVNLFFISYIKAYNDLVLFLKQQEIVFINILHLNNLNLSIYNLLQKCYSTKDKYKFLPDNNKNLLQLILTLKKNVKFRLKRLKDK

И я ищу способ bash для добавления "_CT" сразу после >Seqnames, поэтому я должен получить:

>YP_00698.1_CT hypothetical protein sp [Species 1]
MDMQFGYFTRNPSTKYPATLYPREVSCALYEDDNENTSLIPKSRHYHYTIQPPINYKKLTNVDRYKNFRL

>YP_0098.1_CT hypothetical protein sp [Species 2]
MDMQFGYFTRNPSTKYPATLYPREVSCALYEDDNENTSLIPKSRHYHYTIQPPINYKKLTNVDRYKNFRL

>YP_009378.1_CT hypothetical protein sp [Species 3]
MEDNTAEDIIKNHLLNTSNDDDDDADSLKKKKENIDDIVKESKNVNLFFISYIKAYNDLVLFLKQQEIVFINILHLNNLNLSIYNLLQKCYSTKDKYKFLPDNNKNLLQLILTLKKNVKFRLKRLKDK

Я пытался:

sed 's/^\(>.*\)$/\1 _CT/' fastafile.fa

Но я получаю "_CT" в конце ...

Спасибо за вашу помощь.

Ответы [ 4 ]

3 голосов
/ 17 октября 2019

Просто замените первый пробел в каждой строке на _CT:

sed 's/ /_CT /' input_file.fasta

Этого должно быть достаточно, поскольку строки последовательности FASTA не должны содержать пробелов

3 голосов
/ 17 октября 2019

Вы можете использовать sed как

sed 's/^>[^[:space:]]\{1,\}/&_CT/' fastafile.fa > newfastafile.fa
sed 's/^>[^ \t]\{1,\}/&_CT/' fastafile.fa > newfastafile.fa
sed -E 's/^>[^ \t]+/&_CT/' fastafile.fa > newfastafile.fa

См. онлайн-демонстрацию

Подробнее

  • ^ - начало строки
  • > - a > char
  • [^[:space:]]\{1,\} - 1 или более символов, кроме пробелов. Примечание \{1,0\} может быть записано как + в паттерне POSIX ERE (доступно с опцией -E или -r)

* & в запасной части обозначает весь матчзначение.

3 голосов
/ 17 октября 2019

Это можно легко сделать с помощью awk, пожалуйста, попробуйте выполнить следующее.

awk '/^>/{$1=$1"_CT"} 1' Input_file

Объяснение: Добавление пояснения к приведенному выше awk коду.

awk '            ##Starting awk program here.
/^>/{            ##Checking condition if a line starts from > then do following.
  $1=$1"_CT"     ##Setting value of $1 to $1 and concatenating _CT to it too.
}                ##Closing BLOCK for this condition here.
1                ##Mentioning 1 will print edited/non-edited line.
' Input_file     ##Mentioning Input_file name here.

sed решение:

sed '/^>/s/\([^ ]*\)\(.*\)/\1_CT\2/'  Input_file
1 голос
/ 17 октября 2019

Проблема в том, что .* может и будет соответствовать всей строке, особенно если ваш шаблон поиска включает в себя привязку $ "конец строки". Вместо этого используйте что-то, что может соответствовать только имени последовательности, например [^ ]* (последовательность последовательных непробельных символов):

sed 's/^\(>[^ ]*\)/\1_CT/' fastafile.fa

Вы можете попробовать это здесь .

...