Question

J'ai données qui vient toujours dans le bloc de quatre dans le format suivant (appelé 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/>/

Yat-il un moyen simple sed / awk / bash pour les convertir en ce format (appelé FASTA):

>SRR018006.2016 GA2:6:1:20:650 length=36
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGN
>SRR018006.19405469 GA2:6:100:1793:611 length=36
ACCCGCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC

En principe, nous voulons extraire les deux premières lignes de chaque bloc de 4 et remplacer @ avec >.

Était-ce utile?

La solution

Ceci est une vieille question, et il y a eu de nombreuses solutions différentes offertes. Étant donné que la réponse acceptée utilise sed mais a un problème flagrant (ce qui est qu'il remplacera @ avec> lorsque le signe @ apparaît comme la première lettre de la ligne de qualité), je me sens obligé d'offrir une solution simple à base de sed qui fonctionne réellement :

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

La seule hypothèse faite est que chaque lecture occupe exactement 4 lignes dans le fichier FASTQ, mais qui semble assez sûr, dans mon expérience.

Le script fastq_to_fasta dans la boîte à outils de FastX fonctionne également. (Il est à noter que vous devez spécifier l'option -Q33 pour tenir compte maintenant 33 communes Phred + encodages qual. Ce qui est drôle, car il est de jeter les données de qualité quand même!)

Autres conseils

sed n'est pas mort. Si nous jouer au golf:

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

Ou, émulant http: //www.ringtail.tsl .ac.uk / david-Studholme / scripts / fastq2fasta.pl publié par Pierre, qui imprime seul le premier mot (l'identifiant) de la première ligne et fait (un peu) la gestion des erreurs:

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

Il semble y avoir beaucoup d'outils existants pour convertir ces formats; vous devriez probablement utiliser à la place de quoi que ce soit affiché ici (y compris ci-dessus).

Comme détaillé dans Cock, et al (2009) NAR, bon nombre de ces solutions ne sont pas correctes puisque « le caractère « @ » marqueur (ASCII 64) peut se produire partout dans la chaîne de qualité. Cela signifie que tout analyseur ne doit pas traiter ligne commençant par « @ » comme indiquant le début de l'enregistrement suivant, sans vérifier en plus la longueur de la chaîne de qualité ainsi correspond bien la longueur de la séquence. "

Voir http://ukpmc.ac.uk/articlerender.cgi?accid=PMC2847217 pour plus de détails.

juste awk, pas besoin d'autres outils

# 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

J'écris

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

Ceci est le plus rapide que j'ai, et je l'ai coincé dans mon fichier .bashrc:

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

Il ne manque pas sur les lignes de qualité peu fréquentes mais pas impossibles qui commencent par @ ... mais ne parviennent pas à FASTQ emballé, si c'est même légal (il existe cependant).

Voici la solution à la partie « sauter toutes les autres lignes » du problème que je viens d'apprendre de 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

Si tout ce qui doit être fait est de changer un @ à >, alors je pense

while read line
do
    echo "$line" | sed 's/@/>/'
    read line
    echo "$line"

    read line_to_skip
    read line_to_skip
done

va faire le travail.

Quelque chose comme:

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

devrait fonctionner.

Je pense, avec gnu grep cela pourrait se faire avec ceci:

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

ci-dessous

awk '{gsub(/^[@]/,">"); print}' data

où les données sont votre fichier de données. J'ai reçu:

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

Je sais que je suis ainsi à l'avenir, mais au profit de Googlers:

Vous pouvez utiliser fastq_to_fasta de la boîte à outils de FastX . Il gardera le signe @, cependant. Il va également supprimer des lignes avec Ns à moins que vous lui dites pas.

Vous pourriez être intéressé par bioawk, il est une version adaptée de awk qui est accordé pour traiter les fichiers FASTA

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

Remarque: BioAwk est basé sur awk Brian Kernighan qui est documenté dans "Le langage de programmation AWK", par Al Aho, Brian Kernighan, et Peter Weinberger (Addison-Wesley, 1988, ISBN 0-201-07981-X) . Je ne sais pas si cette version est compatible avec Posix .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top