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

时间:2021-07-24 17:38:14

标签: shell for-loop genome

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

有人可以确认这些方法中的至少一种在语法上是正确的,并且会按照我的意愿并行迭代两个文件列表,或者建议一种正确或更好的方法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

将两个文件名列表放在数组中,然后遍历数组索引。

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