Есть ли способ заменить все вхождения определенных символов, но только в каждой n-й строке? - PullRequest
2 голосов
/ 25 марта 2019

Я пытаюсь заменить все символы, которые не являются C, T, A или G на N в части последовательности файла fasta - т.е. каждая вторая строка

Я думаю, что мне понадобится некоторая комбинация awk и tr ...

Чтобы напечатать каждую вторую строку:

awk '{if (NR % 2 == 0) print $0}' myfile

Чтобы заменить эти символы на N

tr YRHIQ- N

... но я не знаю, как их объединить, чтобы замена символов происходила только на каждой 2-й строке, но печатала каждую строку

это то, что у меня есть

>SEQUENCE_1
AGCYGTQA-TGCTG
>SEQUENCE_2
AGGYGTQA-TGCTC

и я хочу, чтобы это выглядело так:

>SEQUENCE_1
AGCNGTNANTGCTG
>SEQUENCE_2
AGGNGTNANTGCTC

, но не так:

>SENUENCE_1
AGCNGTNANTGCTG
>SENUENCE_2
AGGNGTNANTGCTC

Ответы [ 3 ]

2 голосов
/ 25 марта 2019

На ваш вопрос легко ответить, но он не поможет вам, когда вы работаете с обычными fast-файлами. Файлы Fasta имеют заголовок последовательности, за которым следуют одна или несколько строк, которые можно объединить для представления последовательности. Формат файла Fasta примерно соответствует следующим правилам:

  • Строка описания (defline) или строка заголовка / идентификатора, которая начинается с символа «more-then» (>), дает имя и / или уникальный идентификатор последовательности и может также содержать дополнительную информацию.
  • После строки описания указывается фактическая последовательность в стандартной однобуквенной символьной строке. Все, кроме допустимого символа, будет игнорироваться (включая пробелы, табуляторы, звездочки и т. Д.).
  • Последовательность может занимать несколько строк.
  • Формат FASTA с несколькими последовательностями можно получить путем объединения нескольких файлов FASTA с одной последовательностью в общий файл, обычно оставляя пустую строку между двумя последующими последовательностями.

Чтобы ответить на вопрос ОП, если вы просто хотите обработать каждую вторую строку, вам нужно сделать:

awk '!(NR%2){gsub(/[^CTAG]/, "N")}1' file.fasta

Однако этот метод завершится ошибкой в ​​любом из следующих случаев:

  • файл fasta с многострочной последовательностью
  • мультифаст-файл с возможной пустой строкой между последовательными последовательностями

Лучше было бы исключить строку заголовка и обработать все остальные строки:

awk '!/^>/{gsub(/[^CTAG]/, "N")}1' file.fasta
2 голосов
/ 25 марта 2019

Благодаря объяснению @ kvantour о файлах fasta, вот еще одно решение sed, которое подходит вашей задаче лучше, чем старое:

sed '/^>/! s/[^ACTG]/N/g' file.fasta
  • /^>/!: doследующее, если эта строка не начинается с >,
  • s/[^ACTG]/N/g: заменить каждый символ, но ACTG на N.
1 голос
/ 25 марта 2019

Вот одно решение с awk

awk 'NR%2 ==0{gsub(/[^CTAG]/, "N")}1' file

результатом

SEQUENCE_1
AGCNGTNANTGCTG
SEQUENCE_2
AGGNGTNANTGCTC

Пояснение Как хотел OP, я только ищу каждую четную строку, чтобы применить изменение с помощью
NR/2 == 0

NR - количество записей (здесь строк), прочитанных так далеко от file

и gsub(/[^CTAG]/, "N"), которые заменяются всеми символами, которые НЕ являются 'C',' T ',' A ',' G '

[^CTAG] ^ - это отрицание

и awk идет по expression action формат

здесь expression равен NR/2==0, и действие заменяет символы с N на gsub, которые не CTAG

...