【问题标题】:Find & Replace Multiple Sequence Headers in Multiple FASTA Files在多个 FASTA 文件中查找和替换多个序列头
【发布时间】:2019-01-08 07:36:52
【问题描述】:

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

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

    例如:每个文件都包含一个“6934_Sergia_sp”,我需要更改 所有 35 个文件中该名称的每个实例都指向“6934_R_robusta”。我需要对“8324_Sergestes_sp”做同样的事情,将每个文件中的每个实例都更改为“8324_P_vigilax”。用不同的标题冲洗并再重复 2 次。更改标题后,我需要有 35 个与相应输入文件同名的离散输出文件。

  2. 到目前为止,我发现似乎最有希望的内容来自以下链接: https://askubuntu.com/questions/84007/find-and-replace-text-within-multiple-files

    使用以下脚本:

      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' {} \;
    

    像这样运行脚本,我得到“未定义标签”错误。经过研究, https://www.mkyong.com/mac/sed-command-hits-undefined-label-error-on-mac-os-x/

    我发现我应该在 -i give 之后添加“.fas”:

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

    因为在 Mac 上您需要为输出文件指定扩展名。像这样运行脚本,我得到了几乎我正在寻找的每个输入文件,每个输入文件中的正确标题被正确替换为新名称,并且输出被放置在同一目录中。但是,这一次只替换一个标头,并且输出文件具有 .fas.fas 扩展名。

接下来,我将不得不重命名输出文件以删除扩展名中的第二个“.fas”,然后再重写并重新运行脚本 3 次,以使所有内容都按照我想要的方式改变,这不会是世界末日,但绝对不会是理想的。

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

【问题讨论】:

  • edit 你的问题包括简洁、可测试的样本输入和预期输出。
  • Mac sed 将接受sed -i '' 's/.../.../' file(即两个单引号),表示不制作备份文件,只需覆盖现有文件即可。祝你好运。

标签: bash macos sed replace find


【解决方案1】:

您的方法很好,但我更喜欢更冗长的方法,这样我就不必与引号进行太多斗争。比如:

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 所说,对于下一个问题,请包含问题的简明描述以及示例输入和预期输出。

【讨论】:

  • 感谢您的建议。我试过了,但我收到一条错误消息:“sed:1:“s/6934_Sergia_sp/6934_R ...”:无效的命令代码_”它创建了新的fasta文件,但它们是空的。我试图包含我的脚本,但我可以弄清楚如何格式化我的帖子,这样它就不是一个巨大的文本块。话虽如此,你能想出我收到这条消息的原因吗?再次感谢
  • 不知道。用于替换的sed 命令的格式为s/original/substituted/,您可以用分号分隔它们。你写的正是我的命令吗?你能给我完整的错误信息吗?您应该将代码放在原始问题中,以便每个人都可以看到并帮助您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 2013-12-26
  • 2014-01-14
  • 2011-07-29
  • 2020-03-22
  • 2022-07-12
  • 2017-08-27
相关资源
最近更新 更多