我想写一个for循环,它使用一个函数,该函数接受两个变量,这两个变量都是文件。我有一组FASTA文件和一组对应于每个FASTA文件的文本文件,我希望for循环并行地遍历这两个列表。下面是一对文件的函数:
anvi-gen-contigs-database --contigs-fasta fastafile.fna --project-name ProjectName --output-db-path /path/to/file/fastafile.fna.db --external-gene-calls /path/to/file/textfile.txt --ignore-internal-stop-codons
我知道如何设置一个只接受一个变量的for循环,以前我使用的for循环看起来像这样:
for f in *.fna; do
anvi-gen-contigs-database --contigs-fasta $f --project-name ProjectName --output-db-path /path/to/file/${f}_out.db;
done
我一直在寻找这个和其他网站的一种方法来修改前面的for循环,以便它将两个文件作为变量并成对迭代它们,我已经找到了两种可能工作的方法,但我发现的例子都没有涉及使用文件作为变量,所以我想检查并确保for循环将做我想做的事情,然后我尝试运行它。下面是第一种方式:
for f in *.fna and for e in *.txt; do
anvi-gen-contigs-database --contigs-fasta $f --project-name ProjectName --output-db-path /path/to/file/${f}_out.db --external-gene-calls /path/to/file/$e --ignore-internal-stop-codons;
done
这是第二种方式:
for f, e in zip(*.fna, *.txt); do
anvi-gen-contigs-database --contigs-fasta $f --project-name ProjectName --output-db-path /path/to/file/${f}_out.db --external-gene-calls /path/to/file/$e --ignore-internal-stop-codons;
done
有人能确认这些方法中至少有一种在语法上是正确的,并且会像我想要的那样并行迭代两个文件列表,或者建议一个正确或更好的方法吗?谢谢!
将两个文件名列表放入数组中,然后遍历数组索引。
fastas=(*.fna)
texts=(*.txt)
for i in ${#fastas[@]}; do
f=${fastas[i]}
e=${texts[i]}
anvi-gen-contigs-database --contigs-fasta "$f" --project-name ProjectName --output-db-path "/path/to/file/${f}_out.db" --external-gene-calls "/path/to/file/$e" --ignore-internal-stop-codons
done