Obtenir un file fasta assorti

list.txt :

 58759__len__2903 58759__len__2903 673957__len__1655 673957__len__1655 3566454__len__1744 

seq.fasta :

 >58759__len__2903 TTTTCCGTAGAGGAGATCCCTATTTTTAGGTTTGTAAGAGATCATTTT >67777__len__2978 TTTTTAGGTTTGTAAGACCGTAGAG >673957__len__1655 CCCTATTTTTAGGTTTGTAAGGTTTGTAAGACCGTAGAG >3566454__len__1744 GGTTTGTAAGACCGTAGAGGGTTTGTAAGACCGTAGAG 

output.fasta :

 >58759__len__2903 TTTTCCGTAGAGGAGATCCCTATTTTTAGGTTTGTAAGAGATCATTTT >673957__len__1655 CCCTATTTTTAGGTTTGTAAGGTTTGTAAGACCGTAGAG >3566454__len__1744 GGTTTGTAAGACCGTAGAGGGTTTGTAAGACCGTAGAG 

list.txt correspondre la ligne de la list list.txt (si ligne en double, utilisez uniquement la ligne unique) à seq.fasta et extrayez le file FASTA comme indiqué dans le file de sortie.

Le cas simple que vous montrez est sortingvial. Vos séquences ne sont jamais plus d'une seule ligne de sorte que vous pouvez simplement utiliser grep pour searchr chacun de vos ID et la ligne après eux:

 grep -Fwf list.txt -A 1 seq.fasta | grep -v '^--$' > out.fasta 

Le grep -v '^--$' filter simplement les lignes avec -- que grep ajoute entre les groupes de lignes de sortie en utilisant l'option -A .

Pour éviter également les dupes, vous pouvez passer votre list à travers (GNU) sort:

 grep -Fwf <(sort -u list.txt) -A 1 seq.fasta | grep -v '^--$' > out.fasta 

Les drapeaux utilisés sont:

  -f FILE, --file=FILE Obtain patterns from FILE, one per line. The empty file contains zero patterns, and therefore matches nothing. (-f is specified by POSIX.) -w, --word-regexp Select only those lines containing matches that form whole words. The test is that the matching subssortingng must either be at the beginning of the line, or preceded by a non-word constituent character. Similarly, it must be either at the end of the line or followed by a non-word constituent character. Word-constituent characters are letters, digits, and the underscore. -F, --fixed-ssortingngs Interpret PATTERN as a list of fixed ssortingngs, separated by newlines, any of which is to be matched. (-F is specified by POSIX.) -A NUM, --after-context=NUM Print NUM lines of trailing context after matching lines. Places a line containing a group separator (--) between contiguous groups of matches. With the -o or --only-matching option, this has no effect and a warning is given. 

Cependant, dans la plupart des cas, vos séquences comporteront plusieurs lignes et cela ne suffira pas. Si vous faites souvent ce genre de choses, je vous suggère d'installer la suite d'outils exonerate . Ils sont généralement extrêmement utiles pour le travail de bioinformatique et include un bel outil appelé fastafetch qui est conçu pour faire exactement ce que vous voulez:

  1. Installez la suite exonérée. C'est dans les repositorys des systèmes basés sur Debian, et est également disponible à partir d' ici .

     sudo apt-get install exonerate 
  2. Créez un index pour votre file fasta. Ceci est utilisé pour la récupération rapide des séquences.

     fastaindex seq.fasta seq.idx 
  3. Extrayez vos séquences:

     $ fastafetch -f seq.fasta -i seq.idx -Fq <(sort -u list.txt ) >3566454__len__1744 GGTTTGTAAGACCGTAGAGGGTTTGTAAGACCGTAGAG >58759__len__2903 TTTTCCGTAGAGGAGATCCCTATTTTTAGGTTTGTAAGAGATCATTTT >673957__len__1655 CCCTATTTTTAGGTTTGTAAGGTTTGTAAGACCGTAGAG 

Comme note de côté, j'ai écrit un script qui peut le faire et un peu plus. Il peut prendre une ou plusieurs lists d'ID d'input et extraire les séquences correspondantes d'un file multi fasta. Il peut imprimer sur STDOUT ou créer un file pour chaque list d'input. Vous pouvez le find ici .