这是我的问题(使用Mac OS X):
我大约有35个FASTA文件,每个文件有30个序列。每个FASTA文件代表一个基因,并且每个文件中都包含具有相同序列标头的相同个体。标头格式为“ #### _ G_species”,其数字是非顺序的。我需要遍历每个文件并更改4个特定的标头,同时还要将输出保持为35个离散文件,并与相应的输入文件具有相同的名称,最好将输出保存到单独的子目录中。
例如:每个文件都包含一个“ 6934_Sergia_sp”,我需要更改 所有35个文件中该名称的每个实例都存储为“ 6934_R_robusta”。我需要对“ 8324_Sergestes_sp”执行相同的操作,将每个文件中的每个实例更改为“ 8324_P_vigilax”。用不同的标题冲洗并重复2次以上。更改标题后,我需要有35个离散输出文件,它们的名称与其对应的输入文件相同。
到目前为止,我发现似乎最有希望的是来自以下链接: 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给定后添加'.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个替换,同时还可以将输出导出到新的子目录中?
答案 0 :(得分: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所说,顺便说一句,请为下一个问题提供问题的简要说明以及示例输入和预期输出。