首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替换fasta文件中几个序列的标题行,并将它们替换为存储在列表(.txt)中的物种名称。

替换fasta文件中几个序列的标题行,并将它们替换为存储在列表(.txt)中的物种名称。
EN

Stack Overflow用户
提问于 2022-04-23 05:10:56
回答 1查看 379关注 0票数 1

我有一个包含几个序列的fasta文件,但是所有序列的第一行以相同的字符串(ABI)开头,我想更改它,并将其替换为存储在不同文本文件中的物种的名称。

我的fasta文件看起来

代码语言:javascript
复制
>ABI
AGCTAGTCCCGGGTTTATCGGCTATAC
>ABI
ACCCCTTGACTGACATGGTACGATGAC
>ABI
ATTTCGACTGGTGTCGATAGGCAGCAT
>ABI
ACGTGGCTGACATGTATGTAGCGATGA

spp的列表如下所示:

代码语言:javascript
复制
Alsophila cuspidata
Bunchosia argentea
Miconia cf.gracilis
Meliosma frondosa

我如何能够改变我的序列的ABI头,并用我的物种的名称来替换它们,使用这个精确的顺序。

所需产出:

代码语言:javascript
复制
>Alsophila cuspidata
AGCTAGTCCCGGGTTTATCGGCTATAC
>Bunchosia argentea
ACCCCTTGACTGACATGGTACGATGAC
>Miconia cf.gracilis
ATTTCGACTGGTGTCGATAGGCAGCAT
>Meliosma frondosa
ACGTGGCTGACATGTATGTAGCGATGA

我用的是:

代码语言:javascript
复制
awk '
FNR==NR{
  a[$1]=$2
  next
}
($2 in a) && /^>/{
  print ">"a[$2]
  next
}
1
' spp_list.txt FS="[> ]"  all_spp.fasta

这不管用,能有人指点我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-23 06:24:34

你好,不是开发人员,所以别无礼。

希望这能帮到你:

我创建了一个包含以下内容的文件fasta.txt:

代码语言:javascript
复制
>ABI
AGCTAGTCCCGGGTTTATCGGCTATAC
>ABI
ACCCCTTGACTGACATGGTACGATGAC
>ABI
ATTTCGACTGGTGTCGATAGGCAGCAT
>ABI
ACGTGGCTGACATGTATGTAGCGATGA

我还创建了一个文件spplist.txt,其中包含:

代码语言:javascript
复制
Alsophila cuspidata
Bunchosia argentea
Miconia cf.gracilis
Meliosma frondosa

然后我创建了一个名为fasta.py的python脚本,如下所示:

代码语言:javascript
复制
#!/bin/python3

#import re library: https://docs.python.org/3/library/re.html
#import sys library: https://docs.python.org/3/library/sys.html
import re,sys

#saving the reference of the standard output into "original_stdout"
original_stdout = sys.stdout


with open("spplist.txt", "r") as spplist:
    x = spplist.readlines()
    with open("fasta.txt", "r") as fasta:
        output_file = open("output.txt", "w")
        #redirecting standard output to output_file
        sys.stdout = output_file

        for line in fasta:
            if re.match(r">ABI", line):
                print(x[0].rstrip())
                del x[0]
            else:
                print(line.rstrip())

        #restoring the native standard output
        sys.stdout = original_stdout

#Notify the user at the end of the work
print("job done")

(如果希望脚本按原样工作,这三个文件必须位于同一个目录中)

这是我的玩具树:

代码语言:javascript
复制
❯ tree
.
├── fasta.py
├── fasta.txt
└── spplist.txt

要执行脚本,请在目录中打开一个shell,cd并键入:

代码语言:javascript
复制
❯ python3 fasta.py
job done

您将在目录中看到一个名为output.txt的新文件:

代码语言:javascript
复制
❯ tree
.
├── fasta.py
├── fasta.txt
├── output.txt
└── spplist.txt

以下是它的内容:

代码语言:javascript
复制
Alsophila cuspidata
AGCTAGTCCCGGGTTTATCGGCTATAC
Bunchosia argentea
ACCCCTTGACTGACATGGTACGATGAC
Miconia cf.gracilis
ATTTCGACTGGTGTCGATAGGCAGCAT
Meliosma frondosa
ACGTGGCTGACATGTATGTAGCGATGA

希望这能帮到你。猜一下。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71977001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档