我必须编写一个少于 300 个字符的 bash 脚本 (.sh),用于下载此服务器中的所有基因组 22ftp://ftp.ncbi.nih.gov/genomes/Homo_sapiens/(带有 fa.gz 扩展名的)并提取它们。我的第一个任务只是编写,
wget ftp://ftp.ncbi.nih.gov/genomes/Homo_sapiens/CHR_01/hs_alt_CHM1_1.1_chr1.fa.gz | gunzip
但我无法为 22 个文件执行此操作。我发现除了 CHM 和 chr 旁边的数字之外,所有文件都具有相同的名称。例如第十个基因组是ftp://ftp.ncbi.nih.gov/genomes/Homo_sapiens/CHR_10/hs_alt_CHM1_1.1_chr10.fa.gz
我想我必须做某种递归代码,但我对 bash 不太有经验,所以非常感谢任何帮助。谢谢你!
答案1
一个简单的循环就足够了:
for i in {1..22}
do
wget "ftp://ftp.ncbi.nih.gov/genomes/Homo_sapiens/CHR_${i}/hs_alt_CHM1_1.1_chr${i}.fa.gz"
gunzip "hs_alt_CHM1_1.1_chr${i}.fa.gz"
done
循环索引不必只是数字,您还可以通过以下方式获取、MT
和Un
文件:X
Y
for i in {1..22} MT Un X Y
由于第一组数字必须用零填充,printf
因此您可以使用:
或者:
firsti="$(printf "%02d" $i)"
wget "ftp://ftp.ncbi.nih.gov/genomes/Homo_sapiens/CHR_${firsti}/hs_alt_CHM1_1.1_chr${i}.fa.gz"
MT Un X Y
您可以针对每个循环运行测试,但更简单的方法是使用原始. 将字符 ( ) 移动到单独的循环中wget
。