嵌套在终端的循环

时间:2018-06-18 00:33:59

标签: python bash shell

我有一个包含31个不同文件的目录,每个文件代表一个CELL_TYPE(这些文件的示例如下所示)。

public void sales() {       
    int sales = 0; 
    sales = sales + totalSold; 
}

我有一个脚本,为每个CELL_TYPE文件生成22个新文件(所以31 * 22 = 682个文件)。

topControlGenes.GeneSet                          
topProjection_Cluster5Genes.GeneSet
topAstrocytesGenes.GeneSet                       
topProjection_Cluster6Genes.GeneSet
topNeuronsInhCGE1Genes.GeneSet  
topNeuronsInhCGE2Genes.GeneSet      

这适用于每个文件,但我不想在每次脚本完成时更改命令中的名称。相反,我想为我的目录中的每个文件运行此命令。

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:2)

以下是使用嵌套for循环的一种可能解决方案:

# Iterate over all GeneSet files
for f in *.GeneSet; do
    # Figure out the cell type by removing "Genes.GeneSet" from the end of the filename
    cell_type=${f%Genes.GeneSet}
    # Process the file
    echo "Processing file: $f with cell type $cell_type"
    for i in {1..22}; do
        python make_annot.py --gene-set-file "$f"  --bimfile ../../1000G_EUR_Phase3_plink/1000G.EUR.QC.${i}.bim --annot-file ${cell_type}.${i}.annot.gz
    done
done 

答案 1 :(得分:2)

您可以使用以下嵌套的for循环:

for f in *Genes.GeneSet 
do 
    for i in `seq 1 22`
    do 
        python make_annot.py --gene-set-file "${f}"  --bimfile ../../1000G_EUR_Phase3_plink/1000G.EUR.QC.${i}.bim --annot-file `echo "${f}" | grep -oP '^.*(?=Genes.Geneset$)'`.${i}.annot.gz; 
    done
done

这会循环播放所有CELL_TYPEGenes.GeneSetCELL_TYPE.${i}.annot.gz以生成31 * 22 = 682 files组合

其中echo "${f}" | grep -oP '^.*(?=Genes.Geneset$)'用于获取文件名的CELL_TYPE部分