Преобразование FASTQ в FASTA с SED/AWK
У меня есть данные, которые всегда приходят в блоке из четырех в следующем формате (называется FASTQ):
@SRR018006.2016 GA2:6:1:20:650 length=36
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGN
+SRR018006.2016 GA2:6:1:20:650 length=36
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+!
@SRR018006.19405469 GA2:6:100:1793:611 length=36
ACCCGCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
+SRR018006.19405469 GA2:6:100:1793:611 length=36
7);;).;);;/;*.2>/@@7;@77<..;)58)5/>/
Есть ли простой способ sed/awk/bash конвертировать их в этот формат (называемый FASTA):
>SRR018006.2016 GA2:6:1:20:650 length=36
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGN
>SRR018006.19405469 GA2:6:100:1793:611 length=36
ACCCGCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
В принципе, мы хотим извлечь первые две строки в каждом блоке из 4 и заменить @
на >
.
Ответы
Ответ 1
Это старый вопрос, и было предложено много разных решений. Поскольку принятый ответ использует sed, но имеет вопиющую проблему (а именно, что он заменит @s > , когда знак @появится как первая буква линии качества), я вынужден предложить простое решение на основе sed, которое фактически работает
sed -n '1~4s/^@/>/p;2~4p'
Единственное допущение состоит в том, что каждое чтение занимает ровно 4 строки в файле FASTQ, но это кажется довольно безопасным, по моему опыту.
Fastq_to_fasta script в наборе инструментов fastx также работает. (Стоит упомянуть, что вам нужно указать параметр -Q33 для размещения общедоступных кодировок Phred + 33. Это смешно, так как оно все равно отбрасывает данные о качестве!)
Ответ 2
sed не мертв. Если мы играем в гольф:
sed '/^@/!d;s//>/;N'
Или, эмулируя http://www.ringtail.tsl.ac.uk/david-studholme/scripts/fastq2fasta.pl, отправленный Пьером, который печатает только первое слово (id) из первой строки и делает (некоторые ) обработка ошибок:
#!/usr/bin/sed -f
# Read a total of four lines
$b error
N;$b error
N;$b error
N
# Parse the lines
/^@\(\([^ ]*\).*\)\(\n[ACGTN]*\)\n+\1\n.*$/{
# Output id and sequence for FASTA format.
s//>\2\3/
b
}
:error
i\
Error parsing input:
q
Кажется, что существует множество существующих инструментов для преобразования этих форматов; вы, вероятно, должны использовать их вместо всего, что было опубликовано здесь (включая выше).
Ответ 3
Как указано в Cock и др. (2009) NAR, многие из этих решений неверны, поскольку "символ маркера @(ASCII 64) может встречаться где угодно в строке качества. Это означает, что любой парсер не должен обрабатывать строку начиная с символа" @ ", указывающего начало следующей записи, без дополнительной проверки длины строки качества до сих пор соответствует длине последовательности".
Подробнее см. http://ukpmc.ac.uk/articlerender.cgi?accid=PMC2847217.
Ответ 4
просто awk, нет необходимости в других инструментах
# awk '/^@SR/{gsub(/^@/,">",$1);print;getline;print}' file
>SRR018006.2016 GA2:6:1:20:650 length=36
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGN
>SRR018006.19405469 GA2:6:100:1793:611 length=36
ACCCGCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
Ответ 5
См. fastq2fasta.pl в http://www.ringtail.tsl.ac.uk/david-studholme/scripts/
Ответ 6
Я бы написал
awk '
NR%4 == 1 {print ">" substr($0, 2)}
NR%4 == 2 {print}
' fastq > fasta
Ответ 7
Это самое быстрое, что у меня есть, и я застрял в моем файле .bashrc:
alias fq2fa="awk '{print \">\" substr(\$0,2);getline;print;getline;getline}'"
Это не сработает на нечастых, но не невозможных линиях качества, которые начинаются с @... но не завершают FASTQ, если это даже законно (оно существует, хотя).
Ответ 8
awk 'BEGIN{P=1}{if(P==1||P==2){gsub(/^[@]/,">");print}; if(P==4)P=0; P++}' data
>SRR018006.2016 GA2:6:1:20:650 length=36
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGN
>SRR018006.19405469 GA2:6:100:1793:611 length=36
ACCCGCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
ниже
awk '{gsub(/^[@]/,">"); print}' data
где данные - это ваш файл данных.
Я получил:
>SRR018006.2016 GA2:6:1:20:650 length=36
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGN
+SRR018006.2016 GA2:6:1:20:650 length=36
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+!
>SRR018006.19405469 GA2:6:100:1793:611 length=36
ACCCGCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
+SRR018006.19405469 GA2:6:100:1793:611 length=36
7);;).;);;/;*.2>/@@7;@77<..;)58)5/>/
Ответ 9
Здесь решение "пропустить каждую другую строку" часть проблемы, которую я только что узнал из SO:
while read line
do
# print two lines
echo "$line"
read line_to_print
echo "$line_to_print"
# and skip two lines
read line_to_skip
read line_to_skip
done
Если все, что нужно сделать, это изменить один @
на >
, тогда я считаю
while read line
do
echo "$line" | sed 's/@/>/'
read line
echo "$line"
read line_to_skip
read line_to_skip
done
выполнит эту работу.
Ответ 10
Что-то вроде:
awk 'BEGIN{a=0}{if(a==1){print;a=0}}/^@/{print;a=1}' myFastqFile | sed 's/^@/>/'
должен работать.
Ответ 11
Я думаю, что с gnu grep это можно сделать следующим образом:
grep -A 1 "^@" t.txt | grep -v "^--" | sed -e "s/^@/\>/"
Ответ 12
Я знаю, что я в будущем, но в интересах гуглеров:
Вы можете использовать fastq_to_fasta из инструментария fastx. Однако он сохранит знак @. Он также удалит строки с Ns, если вы не сообщите об этом не.
Ответ 13
Вы можете быть заинтересованы в bioawk, это адаптированная версия awk, которая настроена для обработки файлов fasta
bioawk -c fastx '{ print ">"$name ORS $seq }' file.fastq
Примечание: BioAwk основан на awk Брайана Кернигана, который задокументирован в "Языке программирования AWK" Аль Ахо, Брайаном Керниганом и Питером Вайнбергером (Addison-Wesley, 1988, ISBN 0-201-07981-X). Я не уверен, что эта версия совместима с POSIX.