【问题标题】:Problems using awk to select group of sequences from fasta file使用 awk 从 fasta 文件中选择序列组的问题
【发布时间】:2018-02-21 05:54:30
【问题描述】:

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

想法?

【问题讨论】:

  • 你能在这里发布你想要的输出吗?对于上面有很多问题,比如 -vrs 应该是 -vRS 并且您正在 BEGIN 中创建一个数组,该数组将在读取 Input_file 之前执行,然后您尝试遍历该数组 t 中没有值所以它不会打印任何东西,请向我们展示所需的输出,以便我们在这里为您提供帮助。
  • 非常感谢!我编辑了最初的问题,以在输出文件中包含我需要的内容。

标签: unix awk bioinformatics fasta


【解决方案1】:

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

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

你可以这样使用它:

#!/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, +] 的序列为空):

./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, +]

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

#!/usr/bin/env python

import sys
from Bio import SeqIO

fasta_file = sys.argv[1]
pop_name = sys.argv[2]

def get_pop(header):
    """Extracts the population name from the fasta header."""
    return header.split(" ")[1].split("_")[0][1:]

for seq in SeqIO.parse(fasta_file, format="fasta"):
    if get_pop(seq.description) == pop_name:
        print(">%s\n%s" % (seq.description, seq.seq))

sys.exit(0)

【讨论】:

  • 谢谢。这似乎很简单。我试图在mac上执行它并且遇到了很多问题——旧版本的python、未安装dos2unix、可能需要xcode升级等...,所以需要整理这些才能使用它,但我认为它应该运作良好。
  • 你可以试试其他库,比如python2可用的biopython。
  • 那太好了,因为我整天都在拔头发试图让它发挥作用。我可以简单地将代码的 python 3 部分更改为 biopython 吗?
  • 另外,我也一直在尝试在我的 PC 上使用 mobaxterm(unix 环境)来完成这项工作。我已经下载了 python3 插件,并尝试了无数的事情来使它工作,但我遇到了一个又一个错误。是否有任何特殊原因导致该程序不能使用 mobaxterm(本地终端)运行?我当前的问题是“致命的 Python 错误:Py_Initialize:无法获取语言环境编码 LookupError:未知编码:UTF-8”但是,如果我可以使用 biopython 运行它,也许这不会是一个问题。
  • 我添加了一个使用 biopython 和 python2 的版本。它的工作原理与 pyGATB 相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2014-03-01
  • 1970-01-01
相关资源
最近更新 更多