这是我的问题(使用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个离散输出文件,其名称与相应的输入文件相同 .
- 到目前为止我发现的似乎最有希望的是来自以下链接: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' {} \;
像这样运行脚本,我得到"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 回答
你的方法很好,但我更喜欢一个更冗长的方法,我不需要用引号来打那么多 . 就像是:
在这里,您将FastA文件列表提供给循环,您计算一个新的fasta名称(和位置,如果需要),最后在输入上运行
sed
并将输出保留在新文件中 . 注意,您可以在sed
中提供多个替换,以分号分隔 .顺便提一下,正如@Ed Morton所说,请提出下一个问题,包括问题的简明描述以及样本输入和预期输出 .