Empilhamento múltiplo para comandos in

2

Estou operando em grandes quantidades de dados e tenho um protocolo envolvendo vários scripts. Eu o inicio separadamente para cada arquivo de entrada, simplesmente trocando filename no arquivo de texto que contém o comando. Eu gostaria de saber se é possível automatizá-lo para todos os arquivos com certas extensões, quando for x in ... é usado no comando.

Exemplo do que tenho agora

mkdir filename.file && for f in *.different_file; do [[ -n $(awk 'NF{i++} END {if (i<14) print FILENAME}' "$f") ]] && rm "$f" ;done

e a funcionalidade que gostaria de ter:

for x in location/*.file do; mkdir $x && for f in *.different_file; do [[ -n $(awk 'NF{i++} END {if (i<14) print FILENAME}' "$f") ]] && rm "$f" ;done ;done

haveria mais loops dentro do loop principal, mas não empilhando mais.

Como posso conseguir algo assim?

EDIT: Mais algumas informações sobre o que eu quero, perdoe minha linguagem não profissional:

Eu gostaria de ter duas variáveis trabalhando dentro de dois loops, um dentro do outro. Acredito que o uso de loops aninhados, como sugerido por @Lety, pode ser a melhor solução, embora leve algum tempo para testá-lo.

Mais alguns comandos que estou usando para visualizar o problema:

mkdir filename.file && for i in *.file2; do program  /filename.file/filename.file $i> $i.filename.file.out ; done && for f in *.file.out; do [[ -n $(awk 'NF{i++} END {if (i<14) print FILENAME}' "$f") ]] && rm "$f" ;done && for i in *.file.out; do grep -v '^#' $i >> $i.trim; done

Eu gostaria de ter filename.file definido como uma variável que seria a mesma para todos os loops:

for x in *.file do; mkdir $x && for i in *.file2; do program  /$x/$x $i> $i.$x.out ; done && for f in *.file.out; do [[ -n $(awk 'NF{i++} END {if (i<14) print FILENAME}' "$f") ]] && rm "$f" ;done && for i in *.file.out; do grep -v '^#' $i >> $i.trim; done; done

Espero que isso esclareça um pouco. Vou investigar loops aninhados no script bash, outra dificuldade é que ele tem que trabalhar para o cygwin também, mas eu acho que não deveria importar tanto quanto os comandos estão corretos.

    
por Voii 14.05.2015 / 18:36

1 resposta

1

Muito obrigado a @Lety por me indicar onde procurar a resposta. Loops aninhados funcionavam perfeitamente.

#!/bin/bash


outer=1
for x in *.hmm
do
    mkdir $x.dir
    inner=1
    for i in *.emitcons
    do
        program --different_output $i.$x.1mtblout $x $i> $i.$x.1mout
        rm $i.$x.1mout
        let "inner+=1"
    done
    for f in *.1mtblout
    do 
        [[ -n $(awk 'NF{i++} END {if (i<14) print FILENAME}' "$f") ]] && rm "$f"
    done
    for i in *.1mtblout
    do
        grep -v '^#' $i >> $i.trim
    done
    for i in *.trim
    do
        echo $i >> $x\_trim_table
        sed -i -e '$a\' $x\_trim_table
        cat $i >> $x\_trim_table
        sed -i -e '$a\' $x\_trim_table
    done
    let "outer+=1"
echo
done
exit 0

... e muito mais, mas tudo funciona perfeito.

    
por Voii 14.05.2015 / 22:26