2014-06-10 52 views
-3

以下命令在從shell執行時工作正常。我想在python腳本中做同樣的事情(或者說,獲得相同的輸出)。但無論我做什麼,我總是會遇到一些引號錯誤。我試着用os.system ...,subprocess.Popen ...,shlex.split ...來實現這一點,但沒有任何運氣。Python中的OS命令

comm -13 <(grep -e 77772 -e 77778 -e 777710 myfile1.dat | 
      awk 'BEGIN {FS=";"} ; {print $8 "," $1}' | 
      sort -t '.' -k 1,1 -k 2,2) \ 
     <(grep -e 77772 -e 77778 -e 777710 myfile2.dat | 
      awk 'BEGIN {FS=";"} ; {print $8 "," $1}' | 
      sort -t '.' -k 1,1 -k 2,2) | 
     tee output.dat 

(我基本上選擇從包含77772或77778或777710兩個文件,選擇從這些行兩列(列1和column8)線,整理他們找到所特有的myfile2.dat線 - 和將這些行寫入output.dat)。

有沒有更簡單的方法來做到這一點?

+3

_「但無論我做什麼,我總是會遇到一些引號標記錯誤「_。請向我們展示一些導致引號錯誤的代碼 – Kevin

+0

文件有多大?從myfile1.dat讀入內存然後遍歷myfile2.dat並寫入內容可能會更簡單獨特的線條標準輸出和'output.dat',就像你找到它們一樣。不要發佈你可以在Python中輕鬆完成的任務。 – chepner

回答

1

實際的問題很容易回答

subprocess.call(['bash', '-c', 
       '''comm -13 ''' 
       ''' <(grep -e 77772 -e 77778 -e 777710 myfile1.dat | ''' 
       ''' awk 'BEGIN {FS=";"} ; {print $8 "," $1}' | ''' 
       ''' sort -t '.' -k 1,1 -k 2,2) ''' 
       ''' <(grep -e 77772 -e 77778 -e 777710 myfile2.dat | ''' 
       ''' awk 'BEGIN {FS=";"} ; {print $8 "," $1}' | ''' 
       ''' sort -t '.' -k 1,1 -k 2,2) ''' 
       ''' | tee output.dat'''], 
       ) 

這通過你的整個管道作爲一個單一字符串的bash一個實例。 (它使用隱式連接相鄰的字符串以提高可讀性

但是,我建議在Python中完全實現它,而不是分叉多個進程。將myfile1.dat中的相關數據讀入內存(假設它不是太大) ,從myfile2.dat一次處理行,輸出行,如果其中的字段沒有在您從myfile1.dat讀取的數據中找到。

+0

謝謝你的回答!這些文件剛剛超過5千行。我會按你的建議去做。將文件讀入內存。 – user2788485