概括

概括

我有包含许多行的文本文件,其中一些以 ">" 开头(这是所谓的 *.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-/" 

相关内容