2013-05-21 334 views
4

我需要編寫一個python腳本,我需要在其中調用一些awk命令。python腳本中的awk命令

#!/usr/bin/python 
import os, sys 
input_dir = '/home/abc/data' 

os.chdir(input_dir) 
#wd=os.getcwd() 
#print wd 
os.system ("tail -n+2 ./*/*.tsv|cat|awk 'BEGIN{FS="\t"};{split($10,arr,"-")}{print arr[1]}'|sort|uniq -c") 

它給在第8行錯誤:續行符

有沒有一種方法可以讓我得到awk命令獲取到Python腳本中工作後,意外的字符:SyntaxError錯誤? 感謝

+0

逃脫各地\ t時的報價? –

+2

爲什麼?沒有任何sed/awk/sort/uniq可以做到這一點,您不能直接從python中獲得,並且作爲獎勵,您將得到一個在所有平臺上運行的解決方案。 –

回答

7

你有兩種類型在該字符串引號的,所以使用三重引號將整個事情

>>> x = '''tail -n+2 ./*/*.tsv|cat|awk 'BEGIN{FS="\t"};{split($10,arr,"-")}{print arr[1]}'|sort|uniq -c''' 
>>> x 
'tail -n+2 ./*/*.tsv|cat|awk \'BEGIN{FS="\t"};{split($10,arr,"-")}{print arr[1]}\'|sort|uniq -c' 
+1

堆棧溢出不會在'code'塊中正確格式化,但如果您將行粘貼到解釋器中,您將會看到我的意思。 – TehTris

6

您應該使用subprocess而不是os.system

import subprocess 
COMMAND = "tail -n+2 ./*/*.tsv|cat|awk 'BEGIN{FS=\"\t\"};{split($10,arr,\"-\")}{print arr[1]}'|sort|uniq -c" 

subprocess.call(COMMAND, shell=True) 

由於TehTris指出,引號的問題的安排打斷的命令字符串分爲多個字符串。預格式化命令並轉義雙引號可修復此問題。

+0

@Schorsch:謝謝:)它的工作原理! – user1189851

+0

在管道中添加更多'| cat'會使它更好,不是嗎? – tripleee