使用awk从fasta文件

时间:2017-09-12 17:02:38

标签: unix awk bioinformatics fasta

我想将我的fasta文件子集化,以检索属于给定总体的序列。以下是我的文件示例。

>CLocus_12706_Sample_44_Locus_36326_Allele_0 [JoJo_s113.fq; groupI, 125578, +]
TGCAGCATGCTGGTGAACGCGTCATCATAAGCCTGTTGGCGAGCCAGCAGAAGGCGGCATGGGCAGCACTTAATAGGACGCACGTCCTCTGTGTCA
>CLocus_12706_Sample_46_Locus_34641_Allele_0 [JoJo_s115.fq; groupI, 125578, +]
>CLocus_12706_Sample_69_Locus_37751_Allele_0 [LakeCamp_s033.fq; groupI, 125578, +]
TGCAGCATGCTGGTGAACGCGTCATCATAAGCCTGTTGGCGAGCCAGCAGAAGGCGGCATGGGCAGCACTTAATAGGACGCACGTCCTCTGTGTCA
>CLocus_12706_Sample_70_Locus_33595_Allele_0 [LakeCamp_s034.fq; groupI, 125578, +]
TGCAGCATGCTGGTGAACGCGTCATCATAAGCCTGTTGGCGAGCCAGCAGAAGGCGGCATGGGCAGCACTTAATAGGACGCACGTCCTCTGTGTCA
>CLocus_72879_Sample_136_Locus_80036_Allele_0 [NaknekRiver_s148.fq; groupV, 11333693, -]
TGCAGAACGAGATGAGGACAAACACACTCACCACTCTGTGGACATGTAGACGGCTGGCCTGTCCTACCAAGGACAAATACTCCCACAACAGTCCAA

人口是id的一部分,包括例如“LakeCamp”或“JoJo”或“NaknekRiver”。

我试着按照这篇文章来弄清楚如何提取序列。 https://unix.stackexchange.com/questions/253499/extracting-subset-from-fasta-file

为此,我执行了以下操作,其中“JoJo”是这里的首选人口,输入文件为“fasta8c18subset.fa”。

awk -vrs=">" 'BEGIN{t["JoJo"]=1}{if($1 in t){printf ">%s",$0}}' fasta8c18subset.fa

我跑这个时没有收到错误,但我也没有输出。

作为输出,我想得到与该总体相关的整个标题和序列。所以,如果我试图提取“LakeCamp”样本,我希望输出文件包含以下内容

>CLocus_12706_Sample_69_Locus_37751_Allele_0 [LakeCamp_s033.fq; groupI, 125578, +]
TGCAGCATGCTGGTGAACGCGTCATCATAAGCCTGTTGGCGAGCCAGCAGAAGGCGGCATGGGCAGCACTTAATAGGACGCACGTCCTCTGTGTCA
>CLocus_12706_Sample_70_Locus_33595_Allele_0 [LakeCamp_s034.fq; groupI, 125578, +]
TGCAGCATGCTGGTGAACGCGTCATCATAAGCCTGTTGGCGAGCCAGCAGAAGGCGGCATGGGCAGCACTTAATAGGACGCACGTCCTCTGTGTCA

思想?

1 个答案:

答案 0 :(得分:2)

我建议你使用一个可用的fasta格式解析器。

例如,在python3中,您可以使用来自pyGATB的非常高效的解析器。

您可以按如下方式使用它:

dict

使用您的示例文件运行它(奇怪的是#!/usr/bin/env python3 import sys from gatb import Bank fasta_file = sys.argv[1] pop_name = sys.argv[2] def get_pop(header): """Extracts the population name from the fasta header.""" return header.decode("utf-8").split(" ")[1].split("_")[0][1:] for seq in Bank(fasta_file): if get_pop(seq.comment) == pop_name: print(">%s\n%s" % ( seq.comment.decode("utf-8"), seq.sequence.decode("utf-8"))) sys.exit(0) 的空序列):

CLocus_12706_Sample_46_Locus_34641_Allele_0 [JoJo_s115.fq; groupI, 125578, +]

如果您没有python3,可以使用Biopython的./extract_pop.py test.fa "JoJo" >CLocus_12706_Sample_44_Locus_36326_Allele_0 [JoJo_s113.fq; groupI, 125578, +] TGCAGCATGCTGGTGAACGCGTCATCATAAGCCTGTTGGCGAGCCAGCAGAAGGCGGCATGGGCAGCACTTAATAGGACGCACGTCCTCTGTGTCA >CLocus_12706_Sample_46_Locus_34641_Allele_0 [JoJo_s115.fq; groupI, 125578, +] 模块:

SeqIO