将文件名添加到该文件中的行

将文件名添加到该文件中的行

我有来自不同样本的 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后缀

相关内容