Unix 使用awk从fasta文件中选择序列组时出现问题

Unix 使用awk从fasta文件中选择序列组时出现问题,unix,awk,bioinformatics,fasta,Unix,Awk,Bioinformatics,Fasta,我想将我的fasta文件子集,以检索属于给定总体的序列。以下是我的文件示例 >CLocus_12706_Sample_44_Locus_36326_Allele_0 [JoJo_s113.fq; groupI, 125578, +] TGCAGCATGCTGGTGAACGCGTCATCATAAGCCTGTTGGCGAGCCAGCAGAAGGCGGCATGGGCAGCACTTAATAGGACGCACGTCCTCTGTGTCA >CLocus_12706_Sample_46_Locus_

我想将我的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

我试着按照这篇文章来找出如何提取序列

为此,我执行了以下操作,这里选择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

想法?

我建议您使用可用的fasta格式解析器

例如,在python3中,您可以从中使用相当高效的解析器

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

!/usr/bin/env蟒蛇3 导入系统 来自gatb进口银行 fasta_file=sys.argv[1] pop_name=sys.argv[2] def get_popheader: 从fasta标头中提取填充名称。 返回header.decodeutf-8.split[1]。split[0][1:] 对于Bankfasta_文件中的seq: 如果get_popseq.comment==pop_name: 打印>%s\n%s% seq.comment.decodeutf-8, seq.sequence.decodeutf-8 sys.exit0 使用您的示例文件运行此操作,奇怪的是,该文件中CLocus_12706_样本_46_位点_34641_等位基因_0[JoJo_s115.fq;groupI,125578,+]的序列为空:

如果您没有python3,可以使用Biopython的SeqIO模块:

!/usr/bin/env python 导入系统 来自Bio import SeqIO fasta_file=sys.argv[1] pop_name=sys.argv[2] def get_popheader: 从fasta标头中提取填充名称。 返回头.split[1]。split[0][1:] 对于SeqIO.parsefasta_文件中的seq,format=fasta: 如果get_popseq.description==pop_name: 打印>%s\n%s%seq.description,seq.seq sys.exit0
你能把你想要的结果贴在这里吗?上面提到的问题很多,比如-vrs应该是-vrs,你在BEGIN中创建一个数组,在读取输入_文件之前执行,然后你试图遍历数组t,数组t中没有任何值,所以它不会打印任何内容,请告诉我们所需的输出,以便我们可以在这里帮助您。非常感谢!我编辑了我的初始问题,以便在输出文件中包含我需要的内容。谢谢。这似乎很简单。我曾尝试在mac上执行它,但遇到了很多问题-python的旧版本,没有安装dos2unix,可能需要升级xcode等等,所以需要对这些进行分类以使用它,但我认为它应该可以很好地工作。您可以尝试其他库,例如biopython,它可用于python2。这将非常好,因为我一整天都在努力工作。我是否可以简单地将python 3部分的代码更改为biopython?或者,我也一直在尝试在我的PC上使用mobaxterm unix环境来实现这一点。我已经下载了python 3插件,并尝试了无数的方法来实现它,但遇到了一个又一个错误。是否有任何特殊原因导致程序不能使用mobaxterm本地终端工作?我当前的问题是致命的Python错误:Py_Initialize:无法获取区域设置编码LookupError:未知编码:UTF-8,但是,如果我可以使用biopython运行它,也许这不会是一个问题。我添加了一个使用biopython和python2的版本。它的工作原理与pyGATB的相同。
./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, +]