2017-10-11 7 views
1

je un fichier, appelé list.txt, qui est une liste de noms de fichiers:Python: script pour plusieurs scripts bash

input1.txt 
input2.txt 
input3.txt 

Je veux construire un script python qui fera un fichier pour chacun de ces noms de fichiers. Plus précisément, j'en ai besoin pour imprimer du texte, incorporer le nom du fichier et l'enregistrer dans un fichier .sh unique. Mon script est la suivante:

import os 
os.chdir("/Users/user/Desktop/Folder") 

with open('list2.txt','r') as f:  
    lines = f.read().split(' ') 

for l in lines: 
    print "#!/bin/bash\n#BSUB -J",l+".sh","\n#BSUB -o /scratch/DBC/user/"+l+".sh.out\n#BSUB -e /scratch/DBC/user/"+l+".sh.err\n#BSUB -n 1\n#BSUB -q normal\n#BSUB -P DBCDOBZAK\n#BSUB -W 168:00\n" 
    print "cd /scratch/DBC/user\n" 
    print 'grep "input"',l+" > result."+l+".txt" 

    with open('script{}.sh'.format(l), 'w') as output: 
     output.write(l) 

J'ai quelques questions:

  • Les fichiers de sortie contiennent uniquement le nom du fichier - pas le contenu que je l'ai imprimé.

Pour être clair mes fichiers de sortie (je devrais avoir 3) devrait ressembler à ceci:

#!/bin/bash 
#BSUB -J input3.sh 
#BSUB -o /scratch/DBC/user/input1.sh.out 
#BSUB -e /scratch/DBC/user/input3.sh.err 
#BSUB -n 1 
#BSUB -q normal 
#BSUB -P DBCDOBZAK 
#BSUB -W 168:00 

cd /scratch/DBC/user 
grep "input" input3 > result.input3.txt 

Je suis très nouveau pour Python donc je suppose qu'il pourrait y avoir des moyens beaucoup plus simples d'impression et de l'insertion mon texte Toute aide serait très appréciée.

MISE À JOUR J'ai maintenant fait le script suivant, qui fonctionne presque.

import os 
os.chdir("/Users/user/Desktop/Folder") 

with open('list.txt','r') as f: 
    lines = f.read().split('\n') 

for l in lines: 
    header = "#!/bin/bash \n#BSUB -J %s.sh \n#BSUB -o /scratch/DBC/user/%s.sh.out \n#BSUB -e /scratch/DBC/user/%s.sh.err \n#BSUB -n 1 \n#BSUB -q normal \n#BSUB -P DBCDOBZAK \n#BSUB -W 168:00\n"%(l,l,l) 
    script = "cd /scratch/DBC/user\n" 
    script2 = 'grep "input" %s > result.%s.txt\n'%(l,l) 
    all= "\n".join([header,script,script2]) 

    with open('script_{}.sh'.format(l), 'w') as output: 
     output.write(all) 

Le problème que j'ai encore est que cela crée 4 scripts, pas 3 comme je m'y attendais: script_input1.sh, script_input2.sh, script_input3.sh et script_sh. Ce dernier, script_sh a juste le texte imprimé mais rien où le texte "d'entrée" serait. Je pense que c'est parce que mon fichier list.txt a un "\ n" à la fin de celui-ci? Cependant, j'ai regardé et il n'y a pas vraiment. Y a-t-il un moyen de contourner ceci? Peut-être que je peux utiliser une sorte de fonction de longueur?

+0

Il n'y a pas besoin pour utiliser vraiment Python, un script Bash fera-t-il aussi? –

+0

Non, je voudrais vraiment utiliser Python dans cette instance. Je sais que Bash peut le faire. – m93

+1

La solution appropriée serait probablement de passer la variable comme un argument à un script statique, plutôt que d'écrire un certain nombre de scripts statiques avec la variable inline. – tripleee

Répondre

1

Alors, répondre dans l'ordre:

1) Pouvez-vous détailler cette question? Vous comptez 4 fichiers txt bu vous avez seulement 3 scripts différents générés par votre code?

2) Bien sûr, vous devez créer un var, non seulement en utilisant l'instruction d'impression 3) il suffit de modifier les autorisations

Donc, pour summurize, j'utiliser cette approche:

import os 
for i, file in enumerate(os.listdir("/Users/user/Desktop/Folder")): 
    if "input" in file: 
    with open(file) as f: 
     lines = f.readlines() 

     for l in lines: 
      data = "" 
      data += "#!/bin/bash\n#BSUB -J",l+".sh","\n#BSUB -o /scratch/DBC/user/"+l+".sh.out\n#BSUB -e /scratch/DBC/user/"+l+".sh.err\n#BSUB -n 1\n#BSUB -q normal\n#BSUB -P DBCDOBZAK\n#BSUB -W 168:00\n" 
      data += "cd /scratch/DBC/user\n" 
      data += 'grep "input"'+l+" > result."+l+".txt" 

      with open('script%s.sh'%i, 'w') as output: 
       output.write(data) 
      os.chmod("script%s.sh'%i", 700) 

Au fait, mon code c'est juste une supposition. Je pense que vous devriez être plus explicite en indiquant quel est votre problème. Je n'ai pas compris ce que tu veux accomplir.

+0

Merci @FrankBr. Pour répondre à vos questions: 1) En effet, mon fichier list.txt n'a que 3 fichiers (input1.txt, input2.txt et input3.txt). Cependant, mon code actuel fait 4 fichiers: "scriptinput1.sh", "scriptinput2.sh", "scriptinput3.sh" et "script? .sh". Au début, je pensais que mon code faisait un 4ème fichier en raison du fait que j'ai une nouvelle ligne ou des espaces à la fin de list.txt. Mais je supprime tous les espaces et la nouvelle ligne, donc je suis confus. 2) Cela a du sens pour le var. Pouvez-vous expliquer ce que "si" l'entrée "dans le fichier:" fait? – m93

+0

Puisque vous bouclez un dossier, veillez à sélectionner le fichier dont le nom contient "l'entrée". Mais si vous connaissez vos noms de fichiers, laissez tomber cette ligne. Je ne l'ai pas compris. – FrankBr

+0

Merci. Je vais continuer à chercher parce que ça ne marche toujours pas. Le problème 1 est résolu mais j'utilise une variable pour stocker le texte ne fonctionne pas. Python me dit que vous ne pouvez pas ajouter à des variables de tuple. – m93

1

Une autre solution qui, au lieu de créer des fichiers

script1.sh 
script2.sh 
script3.sh 

etc. serait de créer un fichier de fichier script.sh

#!/bin/bash 
#BSUB -J "$1".sh 
#BSUB -o /scratch/DBC/user/"$1".sh.out 
#BSUB -e /scratch/DBC/user/"$1".sh.err 
#BSUB -n 1 
#BSUB -q normal 
#BSUB -P DBCDOBZAK 
#BSUB -W 168:00 

cd /scratch/DBC/user 
grep "input" "$1" > result."$1".txt 

et l'exécuter en utilisant

script.sh input1 
script.sh input2 
script.sh input3