我有包含许多行的文本文件,其中一些以 ">" 开头(这是所谓的 *.fasta 文件,">" 标记新信息容器的开始):
>header_name1
sequence_info
>header_name2
sequence_info
我想将这些行所在的文件的名称添加到标题中。例如,如果文件名为“1_nc.fasta”,则文件内以 > 开头的所有行都应添加标签“001”:
>001-header_name1
sequence_info
>001-header_name2
sequence_info
有好心人给我提供了这一行:
sed 's/^>/>001-/g' 1_nc.fasta>001_tagged.fasta
因此,2_nc.fasta 中的所有标头都应以“002-”开头,3_nc.fasta ->“003-”等。
我知道如何编写并行作业脚本,但作业完成得很快,我认为在循环中串行处理所有文件的脚本要好得多。不幸的是,我无法独自做到这一点。
添加了扭曲:11_nc.fasta 和 149_nc.fasta 不可用。
如何循环遍历目录中的所有 500 个文件?
答案1
这应该可以解决问题。我在下划线处打破文件名以获得数字前缀,然后使用 aprintf
将其补零为三位数字符串。
for file in *.fasta; do
prefix="$(printf "%03d" "${file%%_*}")"
sed "s/^>/>$prefix-/" "$file" > "${prefix}_tagged.fasta"
done
答案2
这似乎可以做到
for f in *.fasta ; do echo sed "s/^>/>$(printf %03d "${f%%_*}")-/" "$f"; done
按照上面的方法进行测试以进行预览,然后删除echo
以查看内容:
for f in *.fasta ; do sed "s/^>/>$(printf %03d "${f%%_*}"-)/" "$f"; done
要制作新文件,请添加重定向
for f in * ; do sed "s/^>/>$(printf %03d "${f%%_*}")/" "$f" > "$(printf %03d "${f%%_*}")_tagged.fasta"; done
答案3
这应该适用于 bash:
for filename in *.fasta; do
index="00${filename%_*}"
addme="${index:((-3)):3}"
sed "s/^>/>$addme-/g" "$filename" > "$addme"_tagged.fasta
done
诀窍是将指数扩大到三位数。然后你需要 " 而不是 ' 来允许 $addme 的扩展
答案4
for n in 000{0..999}; do
M=${n#???} N=${n##${n%???}}
[ -f "${M}_nc.fasta" ] && sed -e "s/^>/&$N-/" < "${M}_nc.fasta" > "${N}_tagged.fasta"
done
概括
n varies from 0000 -> 000999
M varies from 0 -> 999 strip off the first 3 chars ${n#???}
N is computed by removing the last 3 chars from n then what remains
is then stripped , essentially performing the act of padding to 3 digits.
compute the filenames:
fasda filename = ${M}_nc.fasta <------ input file to sed
new filename = ${N}_tagged.fasta <---- output file from sed
sed command: "s/^>/&$N-/"