Вложено для петли в терминале

1

У меня есть каталог с 31 различными файлами, каждый из которых представляет CELL_TYPE (пример из них показан ниже).

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

У меня есть сценарий, который генерирует 22 новых файла для каждого файла CELL_TYPE (поэтому 31 * 22 = 682 файла).

for i in 'seq 1 22'; do python make_annot.py --gene-set-file CELL_TYPEGenes.GeneSet  --bimfile ../../1000G_EUR_Phase3_plink/1000G.EUR.QC.${i}.bim --annot-file CELL_TYPE.${i}.annot.gz;done

Это хорошо работает для каждого файла, но я не хочу менять имя в команде каждый раз, когда заканчивается сценарий. Вместо этого я хочу запустить эту команду для каждого файла в моем каталоге.

Есть ли способ сделать это?

Теги:

2 ответа

2
Лучший ответ

Здесь одно возможное решение с использованием вложенного цикла:

# 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 
  • 0
    Это сработало хорошо. Спасибо за ясный ответ, теперь я знаю, как писать вложенные циклы в bash!
  • 0
    Внутренний цикл for может быть записан более эффективно, чем for ((i=1; i <= 22; i++)); do так, чтобы мы исключили внешнюю команду seq .
Показать ещё 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.GeneSet и вашей CELL_TYPE.${i}.annot.gz для создания ваших комбинаций 31 * 22 = 682 files

Где echo "${f}" | grep -oP '^.*(?=Genes.Geneset$)' echo "${f}" | grep -oP '^.*(?=Genes.Geneset$)' используется для получения части CELL_TYPE имени файла

  • 0
    @erip: отредактировано, так как на самом деле это совершенно не нужно ;-) Спасибо за ваш отзыв!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню