У меня есть каталог с 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
Это хорошо работает для каждого файла, но я не хочу менять имя в команде каждый раз, когда заканчивается сценарий. Вместо этого я хочу запустить эту команду для каждого файла в моем каталоге.
Есть ли способ сделать это?
Здесь одно возможное решение с использованием вложенного цикла:
# 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
Вы можете использовать следующие вложенные 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 имени файла
for ((i=1; i <= 22; i++)); do
так, чтобы мы исключили внешнюю командуseq
.