繁体   English   中英

如何根据标识符列表提取参考文本的特定部分?

[英]How to extract specific parts of a reference text, based on a list of identifiers?

我有一个参考文件 (.fasta) 和一个基因 ID 列表。 对于基因ID列表中的每个ID,我需要将对应的序列放入一个文本文件中。 我怎样才能自动化呢?

到目前为止我尝试过的事情:

  1. sed

sed -n -e '/{GENEID1}/,/>/p' referencefile.fasta | sed $d >> seqs.txt

'>' 是我希望 sed 停止的字符。 我需要第二个 sed 来删除最后一行,这也抓住了下一个序列的第一行。 如果我只运行一次,这有效,但如果我尝试

cat geneID.txt | xargs sed -n -e '/{}/,/>/p' referencefile.fasta >> seqs.txt

然后我只得到一个 ID 列表,没有序列。 它也需要很长时间,所以我假设 sed 正在阅读参考文件,但我不明白为什么它不会抓取序列?

  1. grep

grep -o -P '(?={GENEID}).*(?=>)

在这里我有同样的问题 - 单独工作,但不适用于 xargs 或循环。

  1. 使用 for 循环

     for LINE in $(cat geneIDs.txt); do echo $LINE >> seqs.txt sed -n -e '/$LINE/,/>/p' referencefile.fasta | sed $d >> seqs.txt done

我也愿意在 python 中尝试一些东西,尽管我还不是很精通它。 我的初步尝试是基于这里的这个问题 我有一个 10 行的测试 ID 列表,我尝试这样运行:

t = open('test.txt', 'r')
test = t.readlines()
test = test.split()
t.close()

with open('referencefile.fasta', 'r') as ref:
    for line in ref:
        for i in test:
            if i in line:
                print(line)

这一个,我什至无法从参考文件中获得序列,无论循环如何。

大家能看出问题吗? 为什么这些都不会给我序列?

提前致谢!

编辑添加:

示例参考:

>000000F
ctatcttcgaggttgccacctgtatcgaggagttggcgtctagatcacgaacatgtattttagctatcgtgagctcacacctgacggatccagctttcgaggtcacatcctcaagtctcg


>000001F
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN

>000002F

TGCGTGAGGTGCTAGGGATGACAATTGAAAAGAGGACATTGATCGATCACTTGACTCATTTCAGAAAGGAGTTTGGGTTGTCCAACAAGTTGAGGGGGATGATCATCAGGCATCCTGAGT

测试 ID:000000F、000001F

理想结果:

000000F ctatcttcgaggttgccacctgtatcgaggagttggcgtctagatcacgaacatgtattttagctatcgtgagctcacacctgacggatccagctttcgaggtcacatcctcaagtctcg

000001F NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN

当前结果:

000000F 000001F

如果您的 fasta 文件中的一个geneId 后面总是有一行,这将有所帮助:

grep -A1 -Fwf geneIds.txt input.fasta

检查这个例子:

$  head -n 20 *
==> ids.txt <==
000000F
000001F

==> input.fasta <==
>000000F
Yes I want it!


>000001F
Yes I want it too!

>000002F
skip

>00000XYZ
skip

kent$  grep -A1 -Fwf ids.txt input.fasta
>000000F
Yes I want it!
--
>000001F
Yes I want it too!

取决于大小和访问模式以及您可以使用的其他序列,因为它可能是最简单的构建一个 BLAST 数据库,然后将您的标识符提供给它,它会准确返回您要求的内容(格式正确的 FASTA 除外)。

优点是它设计精良,经过测试且速度快

缺点是对你的任务来说可能是多余的

(但如果您将继续在这个领域工作,仍然非常有用)

https://duckduckgo.com/?q=build+a+blast+database&ia=web

鉴于:

$ cat file
>000000F
ctatcttcgaggttgccacctgtatcgaggagttggcgtctagatcacgaacatgtattttagctatcgtgagctcacacctgacggatccagctttcgaggtcacatcctcaagtctcg


>000001F
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN

使用awk您可以在段落模式下读取由两个或多个\n分隔的数据。 这使您可以轻松地以该格式构建文件的关联数据库。

示例,按确切字符串搜索:

awk -v RS= -v FS="\n" -v q=">000000F" '$1==q{print $2}' file
ctatcttcgaggttgccacctgtatcgaggagttggcgtctagatcacgaacatgtattttagctatcgtgagctcacacctgacggatccagctttcgaggtcacatcctcaagtctcg

或通过正则表达式搜索:

awk -v RS= -v FS="\n" -v q="[01]F$" '$1~q {print $2}' file
ctatcttcgaggttgccacctgtatcgaggagttggcgtctagatcacgaacatgtattttagctatcgtgagctcacacctgacggatccagctttcgaggtcacatcctcaagtctcg
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN

或者,构建一个关联数组:

awk -v RS= -v FS="\n"   '{arr[$1]=$2} END{ "do something with the data in arr" }' file

您可以使用它从具有 id 列表的文件中打印:

cat ids
>000001F
>000000F

awk -v RS= -v FS="\n"  'FNR==NR{for(i=1; i<=NF; i++) ids[$i]; next}
$1 in ids{print $2}' ids file
ctatcttcgaggttgccacctgtatcgaggagttggcgtctagatcacgaacatgtattttagctatcgtgagctcacacctgacggatccagctttcgaggtcacatcctcaagtctcg
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM