首页 文章

在多个FASTA文件中查找和替换多个序列 Headers

提问于
浏览
-1

这是我的问题(使用Mac OS X):

  • 我有大约35个FASTA文件,每个文件有30个序列 . 每个FASTA文件代表一个基因,它们都包含相同的个体,每个文件中具有相同的序列 Headers . Headers 格式为“#### _ G_species”,数字为非顺序 . 我需要遍历每个文件并更改4个特定标头,同时还将输出保持为35个离散文件,其名称与相应的输入文件相同,最好将输出存放到单独的子目录中 .

例如:每个文件都包含一个“6934_Sergia_sp”,我需要将所有35个文件中该名称的每个实例更改为“6934_R_robusta” . 我需要对“8324_Sergestes_sp”执行相同的操作,将每个文件中的每个实例更改为“8324_P_vigilax” . 用不同的接头冲洗并重复2次 . 更改 Headers 后,我需要有35个离散输出文件,其名称与相应的输入文件相同 .

使用以下脚本:

find /home/user/directory -name \*.c -exec sed -i "s/cybernetnews/cybernet/g" {} \;

根据我的需要更改信息,我得到一个这样的脚本:

find Path/to/my/directory -name \*.fas -exec sed -i 's/6934_Sergia_sp/6934_R_robusta/g' {} \;

像这样运行脚本,我得到"undefined label"错误 . 经过研究,https://www.mkyong.com/mac/sed-command-hits-undefined-label-error-on-mac-os-x/

我发现在-i给出之后我应该添加'.fas':

find Path/to/my/directory -name \*.fas -exec sed -i '.fas' 's/6934_Sergia_sp/6934_R_robusta/g' {} \;

因为在Mac上你需要为输出文件指定一个扩展名 . 运行这样的脚本,我得到的几乎是我正在寻找的每个输入文件被复制,每个正确的 Headers 正确替换新名称,输出放在同一目录中 . 但是,这一次只能替换一个标头,输出文件的扩展名为.fas.fas .

继续前进,我将不得不重命名输出文件以删除扩展中的第二个“.fas”,并重写并重新运行脚本3次,以便按照我想要的方式更改所有内容,这不会是结束世界,但绝对不会是理想的 .

是否可以设置脚本以便我可以同时运行所有4个替换,同时还将输出导出到新的子目录?

1 回答

  • 0

    你的方法很好,但我更喜欢一个更冗长的方法,我不需要用引号来打那么多 . 就像是:

    for fasta in $(find Path/to/my/directory -name "*.fas")
    do
        new_fasta=$(basename $fasta .fas).new.fas
        sed 's/6934_Sergia_sp/6934_R_robusta/g; s/Another_substitution/Another_result/' $fasta > $new_fasta
    done
    

    在这里,您将FastA文件列表提供给循环,您计算一个新的fasta名称(和位置,如果需要),最后在输入上运行 sed 并将输出保留在新文件中 . 注意,您可以在 sed 中提供多个替换,以分号分隔 .

    顺便提一下,正如@Ed Morton所说,请提出下一个问题,包括问题的简明描述以及样本输入和预期输出 .

相关问题