2 votes

Empilement de plusieurs commandes "for in

Je travaille sur de grandes quantités de données et j'ai un protocole impliquant plusieurs scripts. Je le lance séparément pour chaque fichier d'entrée, en intervertissant simplement filename dans le fichier texte contenant la commande. J'aimerais savoir s'il est possible de l'automatiser pour tous les fichiers ayant certaines extensions, lorsque for x in ... est utilisé dans la commande.

Exemple de ce que j'ai maintenant

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

et les fonctionnalités que j'aimerais avoir :

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

il y aurait plus de boucles à l'intérieur de la boucle principale, mais il n'y aurait plus d'empilement.

Comment puis-je réaliser une telle chose ?

EDIT : Quelques informations supplémentaires sur ce que je veux, pardonnez mon langage non professionnel :

J'aimerais que deux variables fonctionnent à l'intérieur de deux boucles, l'une à l'intérieur de l'autre. Je pense que l'utilisation de boucles imbriquées comme suggéré par @Lety pourrait être la meilleure solution bien que cela prenne un certain temps pour la tester.

Quelques commandes supplémentaires que j'utilise pour visualiser le problème :

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

J'aimerais que filename.file soit une variable identique pour toutes les boucles :

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

J'espère que cela clarifie un peu les choses. Je vais étudier les boucles imbriquées dans bash script, une autre difficulté est que cela doit fonctionner pour cygwin également, mais je suppose que cela ne devrait pas avoir d'importance tant que les commandes sont correctes.

1voto

CornSmith Points 133

Merci à @Lety de m'avoir indiqué où chercher la réponse. Les boucles imbriquées fonctionnent parfaitement.

#!/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

...et bien d'autres choses encore, mais tout fonctionne parfaitement.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X