如何编写代码以遍历Linux中的多个文件?

时间:2019-03-15 16:01:14

标签: linux bash

我有尝试从另一个示例更新的代码。目的是使用以下文件运行plink:每个染色体,snp id和仅包含1个ID(即个人ID)的文件。在plink中运行这些文件最终将为给定染色体的每个人创建一个vcf文件。

我有22个染色体文件,1个snp文件(始终相同)和500个单独的文件。我的目标是为每个染色体制作一个vcf,因此我有22 * 500(11000)个vcf文件作为输出。

此刻,我已经尝试过使用以下bash脚本:

ID=$SGE_TASK_ID
indiv=$SGE_TASK_ID

plink --bed chr${ID}.bed --bim chr${ID}.bim --fam chr${ID}.fam --extract snps.txt
--recode vcf-iid --out output${indiv}chr${ID}vcf --keep-fam individual${indiv}.txt

这会运行,但是只运行1个人,给我一个人的22个染色体vcf文件,并在那里停止。我该如何为所有500个人执行此操作,是否会使用for循环?通过其他问题,我一直找不到与我的问题匹配的问题,并且在linux中,任何帮助将不胜感激。

$ {indiv}只是一个数字,因此运行的文本文件看起来像personal1.txt,并增加了500个人(individual1.txt,individual2.txt,individual3.txt)

1 个答案:

答案 0 :(得分:-1)

假设${indiv}不包含空格,

for indiv in $(<individuals.data); do
    plink [...] individual${indiv}.txt
done

文件individuals.data将用空格或换行符隔开的名称来命名个人。

如果不确定Bash shell的$(<...)运算符的作用,请尝试以下操作:

for A in $(<individuals.data); do
    echo "[$A]"
done

请注意,正如@Kaz观察到的那样,如果希望您的脚本也可以在Bash以外的shell中工作,那么您可以编写$(cat ...)而不是$(<...)