Bash loop através de dois conjuntos de arquivos

0

Eu estou tentando escrever um script bash que pode iterar através de duas pastas e executar os arquivos em um programa python. O programa python usa dois arquivos de entrada (os correspondentes de cada pasta) e gera um único arquivo.

Parece um pouco assim:

folder 1/
    Run_1.out
    Run_2.out
    Run_3.out
    ...
folder 2/
    Sym_1.g0.out
    Sym_2.g0.out
    Sym_3.g0.out
    ...

O programa python recebe as entradas correspondentes (por exemplo, Run_1.out e Sym_1.g0.out ) e gera um arquivo como tal:

    NOCI.py Run_1.out Sym_1.g0.out outputfile

O programa python funciona bem quando usado através do terminal com um único par de arquivos, mas desde que eu tenho 360 pares, eu imaginei que deveria usar um script. Até agora eu tentei escrever dois loops for, mas parece não funcionar:

    #!/bin/bash
    FILE1=*.out
    FILE2=*.g0.out
    for i in $FILE1
    do
        for j in $FILE2
            do
                NOCI.py $i $j ${i}_${outputfile}
        done
    done
    
por Plasmid 07.09.2018 / 19:18

3 respostas

1

Corresponde folder 1/Run_1.out a folder 2/Sym_1.g0.out e assim por 360 pares:

for n in {1..360}
do
    NOCI.py "folder 1/Run_$n.out" "folder 2/Sym_$n.g0.out" outputfile
done

Ou, se os arquivos emparelhados não estiverem em ordem seqüencial, você poderá selecionar os arquivos Run_N.out e associar um arquivo Sym_N.g0.out correspondente:

for r in "folder 1/Run_"*.out
do
    n="${r#folder 1/Run_}"; n="${n%.out}"
    s="folder 2/Sym_$n.out"
    NOCI.py "$r" "$s" outputfile
done
    
por 07.09.2018 / 21:01
0

Com o GNU Parallel, você pode fazer isso:

parallel NOCI.py {1} {2} {1.}{2.}.output ::: Folder1/* ::: Folder2/*

O padrão é executar um trabalho por thread de CPU em paralelo.

Para ver o que será executado, use --dry-run :

parallel --dry-run NOCI.py {1} {2} {1.}{2.}.output ::: Folder1/* ::: Folder2/*

O GNU Parallel é um paralelizador geral e facilita a execução de trabalhos em paralelo na mesma máquina ou em várias máquinas para as quais você tem acesso ssh.

Se você tem 32 tarefas diferentes que você quer rodar em 4 CPUs, uma forma direta de paralelizar é rodar 8 tarefas em cada processador:

O

GNUParallelgeraumnovoprocessoquandoumtermina-mantendoasCPUsativaseeconomizandotempo:

Instalação

Por razões de segurança, você deve instalar o GNU Parallel com seu gerenciador de pacotes, mas se o GNU Parallel não estiver empacotado para sua distribuição, você pode fazer uma instalação pessoal, que não requer acesso root. Isso pode ser feito em 10 segundos ao fazer isso:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

Para outras opções de instalação, consulte o link

Saiba mais

Veja mais exemplos: link

Assista aos vídeos de introdução: link

Percorra o tutorial: link

Leia o livro: link

Inscreva-se na lista de e-mail para obter suporte: link

    
por 07.09.2018 / 21:10
0

zsh seria mais adequado do que bash para esse tipo de tarefa:

#! /bin/zsh -
files1=(1/*.out(n)) files2=(2/*.go.out(n))
for f1 f2 (${files1:^files2}) NOCI.py $f1 $f2 3/$f1:t:r+$f2:t
  • (n) ordena os globs numericamente para que eles sejam processados em ordem numérica (onde Run_10 fica entre Run_9 e Run_11 em vez de entre Run_1 e Run_2 sem ele).
  • ${array1:^array2} : fecha duas matrizes
  • $file:t : parte final do arquivo (nome base)
  • $filr:r : parte raiz (remover extensão).

Então, acabamos correndo:

NOCI.py 1/Run_1.out 2/Sym_1.g0.out 3/Run_1+Sym_1.g0.out
NOCI.py 1/Run_2.out 2/Sym_2.g0.out 3/Run_2+Sym_2.g0.out
...
    
por 07.09.2018 / 23:14