【发布时间】:2022-01-05 15:30:03
【问题描述】:
我有一个参考文件 (.fasta) 和一个基因 ID 列表。对于基因ID列表中的每个ID,我需要将对应的序列放入一个文本文件中。如何实现自动化?
到目前为止我尝试过的事情:
- 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 正在读取参考文件,但我不明白为什么它不会抓取序列?
- grep
grep -o -P '(?={GENEID}).*(?=>)
在这里我遇到了同样的问题 - 单独工作,但不适用于 xargs 或循环。
-
使用 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 中尝试一些东西,尽管我还不是很精通它。我的初步尝试是基于this question here。我有一个 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 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
当前结果:
000000F 000001F
【问题讨论】:
-
edit 您的问题显示minimal reproducible example 具有简洁、可测试的样本输入和预期输出,以便我们为您提供帮助。如果您不向我们展示您的输入,我们无法告诉您为什么您的正则表达式与您的输入不匹配。
-
@EdMorton,谢谢,我已经改了
-
使用代码块格式化,见stackoverflow.com/help/formatting
标签: python awk sed grep text-extraction