问题描述
我想写一个 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