shell脚本中的 For循环遍历两个文件列表



我想写一个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

相关内容

  • 没有找到相关文章

最新更新