سؤال

لدي بيانات في أن تأتي دائمًا في كتلة من أربعة في التنسيق التالي (تسمى 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 واستبدال @ مع >.

هل كانت مفيدة؟

المحلول

وهذا هو السؤال القديم، وكانت هناك العديد من الحلول المختلفة المقدمة. منذ الاستخدامات الإجابة المقبولة سد ولكن لديه مشكلة صارخ (وهو أنه سيحل محل @ مع> عندما يظهر @ علامة مثل الحرف الأول من خط الجودة)، أجد نفسي مضطرا لتقديم بسيط حل سد المستندة أن يعمل فعلا :

sed -n '1~4s/^@/>/p;2~4p' 

والافتراض الوحيد الذي قدمته هو أن كل قراءة تحتل بالضبط 4 خطوط في ملف FASTQ، ولكن يبدو أن آمنة جدا، في تجربتي.

والسيناريو fastq_to_fasta في أدوات fastx يعمل أيضا. (ومن الجدير بالذكر أن تحتاج إلى تحديد الخيار -Q33 لاستيعاب PHRED + 33 ترميزات التأهيلية الآن المشتركة. ما هو مضحك، نظرا لأنه رمي نوعية البيانات على أي حال!)

نصائح أخرى

والحوار الاقتصادي الاستراتيجي لم يمت. إذا نحن الغولف:

sed '/^@/!d;s//>/;N'

وأو محاكاة HTTP: //www.ringtail.tsl .ac.uk / ديفيد studholme / مخطوطات / fastq2fasta.pl المرسلة بواسطة بيير، الذي يطبع فقط الكلمة الأولى (هوية) من السطر الأول ويفعل (بعض) التعامل مع الخطأ:

#!/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

ويبدو أن هناك الكثير من الأدوات الموجودة لتحويل هذه الأشكال. ربما يجب عليك استخدام هذه بدلا من أي شيء نشر هنا (بما في ذلك أعلاه).

وكما هو مفصل في الديك، وآخرون (2009) NAR، وكثير من هذه الحلول غير صحيحة لأن "" @ "حرف علامة (ASCII 64) قد تحدث في أي مكان في سلسلة الجودة. وهذا يعني أن أي محلل يجب على ألا نعامل خط البداية مع "@" كما يشير إلى بداية السجل التالي، دون بالإضافة إلى التحقق من طول السلسلة جودة مباريات حتى الآن على طول تسلسل ".

http://ukpmc.ac.uk/articlerender.cgi؟accid=PMC2847217 للحصول على مزيد من التفاصيل.

وفقط 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

وانظر على fastq2fasta.pl في HTTP: //www.ringtail.tsl.ac.uk/david-studholme/scripts/

وكنت أكتب

awk '
    NR%4 == 1 {print ">" substr($0, 2)}
    NR%4 == 2 {print}
' fastq > fasta

وهذا هو أسرع عندي، وأنا عالقة في ملف .bashrc بلدي:

alias fq2fa="awk '{print \">\" substr(\$0,2);getline;print;getline;getline}'"

وأنها لا تفشل على قلتها ولكن ليس نوعية خطوط المستحيل أن تبدأ مع @ ... ولكن لا تفشل في FASTQ ملفوفة، اذا كان هذا حتى القانوني (كان موجودا على الرغم من).

وهنا حل جزء "تخطي كل خط آخر" المشكلة أنني علمت للتو من 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

وسوف قيام بهذه المهمة.

وشيء من هذا القبيل:

awk 'BEGIN{a=0}{if(a==1){print;a=0}}/^@/{print;a=1}' myFastqFile | sed 's/^@/>/'

ويجب أن تعمل.

وأعتقد، مع حكومة الوحدة الوطنية البقرى ويمكن أن يتم هذا مع هذا:

grep -A 1 "^@" t.txt | grep -v "^--" | sed -e "s/^@/\>/"
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/>/

وأنا أعرف الطريقة في المستقبل، ولكن لصالح من موظفي Google:

وأنت قد ترغب في استخدام fastq_to_fasta من fastx أدوات . وسوف تبقى علامة @، على الرغم من. انها ستزيل أيضا خطوط مع نانوثانية إلا إذا كنت أقول أن لا.

قد تكون مهتمًا بـ bioawk، فهو نسخة معدلة من awk تم ضبطها لمعالجة ملفات fasta

bioawk -c fastx '{ print ">"$name ORS $seq }' file.fastq

ملحوظة: BioAwk مبني على بريان كيرنيغان محرج الذي تم توثيقه في "لغة البرمجة AWK" ، من تأليف Aho و Brian Kernighan و Peter Weinberger (Addison-Wesley ، 1988 ، ISBN 0-201-07981-X).لست متأكدًا مما إذا كان هذا الإصدار متوافقًا مع بوسيكس.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top