背景信息:我正在运行 Prokka(作为一名生物信息学新手,没有 Prokka,也很少有 Bash 经验),并且我有多个 FASTA 文件。
有人告诉我需要生成一个 Bash 循环,允许我一一输入 FASTA 文件。
例如:包含所有 FASTA (.fna) 文件的目录名为 StaphFNA,其中有 1000 个 FASTA 文件。它们都以 ID 号命名 - 但并不像正常情况那样递增(因此它们不是编号为 1、2、3 等)存在随机跳跃,例如,第一个是 34872,下一个是 8933。
我需要输入 StaphFNA 中的第一个 FASTA 文件,在 Prokka 中处理,然后输出到名为“StaphProkka”的文件,然后第二个 FASTA 文件经历相同的过程 - 再次输出到“StaphProkka”。如此下去,直到所有 1000 个都完成。
正如你可以想象的,这样做 1000 次有点费力,所以我希望做一个循环,但我对 bash 很陌生,我很挣扎。
我的 Prokka 论点(我认为是正确的):
prokka /Users/me/Documents/StaphFNA --outdir StaphProkka --prefix staph_aur --kingdom bacteria --locusting staphylococcus
我的 For 循环(我知道这是错误的):
i = 0
for i in StaphFNA/.fna*; do
prokka /Users/me/Documents/StaphFNA/$i --outdir StaphProkka --prefix staph_aur --kingdom bacteria --locusting staphylococcus
i = i + 1
done
答案1
如果您不需要指定输出文件并且 prokka 根据其输入生成不同名称的文件,您所需要的只是:
for file in /Users/me/Documents/StaphFNA/*.fna; do
prokka "$file" \
--outdir StaphProkka \
--prefix staph_aur \
--kingdom bacteria \
--locusting staphylococcus
done
该for variable in dir/*
模式将迭代中的每个文件或目录dir/
并将其路径名保存为$variable
,因此您不需要计数器或其他任何东西。如果您确实需要使用计数器,例如处理file1.fa
等file2.fa
,并且不想也处理otherfile.fa
,您会像这样(注意 周围缺少空格=
,这很重要):
for ((i=0; i<=10; i++)); do
someCommand "file${i}.fa"
done
或者,如果您需要显式增加计数器(这种情况很少见),您可以这样做:
i=0
while [ "$i" -le 10 ]; do
echo someCommand "file${i}.fa"
(( i++ ))
done