2017-10-11 51 views
1

我有一個文件,叫做LIST.TXT,這是文件的名稱的列表:的Python:腳本進行多次的bash腳本

input1.txt 
input2.txt 
input3.txt 

我想建立一個python腳本,這將使一個文件每個這些文件名。更確切地說,我需要它來打印一些文本,合併文件的名稱並將其保存到一個唯一的.sh文件中。我的腳本如下:

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) 

我有幾個問題:

  • 輸出文件只包含文件的名稱 - 不是我所打印的內容。

需要明確的是我的輸出文件(我應該有3個)應該是這樣的:

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

我很新的Python所以我假設有可能是印刷簡單得多的方式和插入我的文字。任何幫助將非常感激。

UPDATE 我現在已經做了下面的腳本,它幾乎可以工作。

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) 

這個問題我還有的是,這4個創建腳本,而不是3如我所料:script_input1.sh,script_input2.sh,script_input3.sh和script_sh。最後一個,script_sh只是打印了文本,但沒有任何「輸入」文本所在的位置。我認爲這是因爲我的list.txt文件在其末尾有一個「\ n」?但是,我看起來真的沒有。有沒有解決的辦法?也許我可以使用某種長度函數?

+0

沒有必要運行真的使用Python,會不會有一個Bash腳本呢? –

+0

不,我真的很想在這種情況下使用Python。我知道Bash可以做到這一點。 – m93

+1

正確的解決方案可能是將變量作爲參數傳遞給靜態腳本,而不是寫入大量帶有變量的靜態腳本。 – tripleee

回答

1

所以,回答依次是:

1)你能詳細介紹這個問題?如果您只有3個由您的代碼生成的不同腳本,您可以統計4個txt文件?

2)當然,你需要創建一個變種,而不僅僅是用print語句 3)只需更改權限

所以,summurize,我會用這個辦法:

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) 

順便說一下,我的代碼只是一個猜測。我想你應該更明確地說明你的問題。我不明白你想達到什麼。

+0

謝謝@FrankBr。 要回答你的問題: 1)的確,我的list.txt文件只有3個文件(input1.txt,input2.txt和input3.txt)。但是,我目前的代碼製作了4個文件:「scriptinput1.sh」,「scriptinput2.sh」,「scriptinput3.sh」和「script?.sh」。起初,我認爲我的代碼正在創建第4個文件,因爲我在list.txt結尾處有一個換行符或空格。但是我刪除了任何空格和換行符,所以我很困惑。 2)這是有意義的變種。 你能解釋一下在文件中輸入「if」是什麼嗎? – m93

+0

由於您在一個文件夾上循環,請務必選擇名稱中包含「輸入」的文件。但是如果你知道你的文件名,就放下那一行。我不明白這一點。 – FrankBr

+0

謝謝。我會繼續尋找,因爲它仍然沒有工作。問題1已解決,但我使用變量來存儲文本不起作用。 Python告訴我你不能追加到元組變量。 – m93

1

另一種解決方案,而不是創建文件

script1.sh 
script2.sh 
script3.sh 

等將是創建一個文件,文件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 

,並使用

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