我有来自不同样本的 fasta 文件,例如:01.fasta、02.fasta 等。
它们都包含具有以下模式的 OTU 列表:
>OTU1
CCTACGGGCGGCTGCAGT
>OTU2
CCTACGGGTGGCTGCAG
我想将文件名(例如 01、02 等)添加到>OTU*
fasta 文件中的每一行以接收以下内容:>OTU1_01
、>OTU2_01
等。
您能帮我编写一个脚本,自动对文件夹中的所有文件执行此操作吗?
答案1
在开始更改所有文件之前,请确保您已备份文件
您可以运行如下所示的命令:
for i in *.fasta; do nr="${i%.fasta}"; sed -i 's/^>OTU\(.*\)$/>OTU\1_'$nr'/' "$i"; done
sed
如果您有支持-i
(就地编辑)的版本。
该nr="${i%.fasta}"
部分从文件名中获取数字。匹配\(.*\)
后面的数字>OTU
,然后将其重新插入\1
答案2
gawk
从 4.1.0 开始,可以使用就地编辑选项。于是一举
awk -i inplace -v INPLACE_SUFFIX=.bak '
BEGINFILE{x=FILENAME; sub(/\..*/, "", x)};
/^>OT/{$0 =$0"_"x};
{print}' *.fasta
将根据需要就地更新文件。-v INPLACE_SUFFIX=.bak
导致原始文件备份时带有.bak
后缀