如何在fasta文件的每个序列头中添加对应文件名?
操作前注意
先备份所有原始fasta文件,避免误操作丢失数据:
mkdir -p fasta_backup && cp *.fasta fasta_backup/
批量处理命令
以下命令均支持自定义是否保留文件名后缀,如果你不需要文件名的后缀(比如文件名是NC_003245.fasta,只想把NC_003245加到序列头),可以选择后缀去除的版本。
1. Linux系统(自带GNU awk,支持原地修改)
直接修改原文件,不会生成额外临时文件:
# 保留文件全名(含后缀)的版本 for file in *.fasta; do awk -i inplace -v fname="$file" '{ if($0 ~ /^>/) { print ">" fname " " substr($0,2) } else { print $0 } }' "$file" done # 去除.fasta后缀的版本(和你示例效果完全一致) for file in *.fasta; do fname=${file%.fasta} awk -i inplace -v fname="$fname" '{ if($0 ~ /^>/) { print ">" fname " " substr($0,2) } else { print $0 } }' "$file" done
2. macOS系统/不想修改原文件的场景
会生成前缀为modified_的新文件,原始文件全程保留不变:
# 去除.fasta后缀的版本 for file in *.fasta; do fname=${file%.fasta} awk -v fname="$fname" '{ if($0 ~ /^>/) { print ">" fname " " substr($0,2) } else { print $0 } }' "$file" > "modified_${file}" done
3. 需要处理子目录下所有fasta文件的场景
用find配合遍历所有层级的子目录:
find . -type f -name "*.fasta" -exec awk -i inplace -v fname="{}" '{ if($0 ~ /^>/) { print ">" fname " " substr($0,2) } else { print $0 } }' {} \;
内容的提问来源于stack exchange,提问作者LDT
相关产品推荐
相关产品推荐

