![](/img/trans.png)
[英]Using the subprocess module in python to run a lua script with command line inputs
[英]Need to run AWK command in python script using subprocess module
c1 = "'BEGIN{FS = OFS = \",\"}{if(toupper($11) ~ \"DVT\"){$(NF+1) = NR==1 ? \"indication\" : \"DVT\"}else if(toupper($11) ~ \"AFIB\"){$(NF+1) = NR==1 ? \"indication\" : \"AFIB\"}else{$(NF+1) = NR==1 ? \"indication\" : \"TESTING\"}} 1'"
print(c1)
p1=subprocess.Popen(["awk",c1,"abc.csv"],stdout=outfile)
p1.communicate()
此命令在 shell 腳本中運行良好。 所以,命令參數看起來不錯。 但是在運行python時,我不斷收到錯誤消息:“表達式中的字符'''無效。”
外部引號是不必要的。 當你有一個 shell 時,單引號是必要的,以保護 awk 腳本不受 shell 影響; 但是在這里,您沒有外殼。 然后你可以也應該擺脫所有這些反斜杠。
如果您只需要運行子Popen
那么您應該更喜歡subprocess.run()
不是裸Popen
,然后在完成后繼續您的程序。
c1 = '''BEGIN{FS = OFS = ","}
{if(toupper($11) ~ "DVT"){$(NF+1) = NR==1 ? "indication" : "DVT"}
else if(toupper($11) ~ "AFIB"){$(NF+1) = NR==1 ? "indication" : "AFIB"}
else{$(NF+1) = NR==1 ? "indication" : "TESTING"}}
1'''
print(c1)
result = subprocess.run(["awk", c1, "abc.csv"],
stdout=outfile)
但是,將 Awk 作為 Python 的子進程運行幾乎總是沒有必要的。 您應該能夠將其重構為大致相同數量的 Python 代碼。
with open("abc.csv") as infile:
firstline = True
for line in infile:
fields = line.rstrip("\n").split(",")
if firstline:
added = "indication"
else:
ind = fields[10].upper()
if "DVT" in ind:
added = "DVT"
elif "AFIB" in ind:
added = "AFIB"
else:
added = "TESTING"
fields.append(added)
outfile.write(",".join(fields) + "\n")
firstline = False
這有點冗長,但這主要是因為我使用了更具描述性的變量名稱。 如果您的輸入文件確實是一個 CSV 文件,則 Python 標准庫中的csv
模塊可以方便地替換拆分邏輯等,盡管它會引入一些其他自己的特性。 如果您必須在 CSV 中處理帶引號的逗號等,這就是它真正增加價值的地方。
所有的事情計,AWK是更簡潔,但這是因為它更專業。 將其嵌入 Python 代碼的主要缺點是讀者必須了解兩種語言才能理解代碼(盡管避免外部進程也總是好的)。 我敢猜測,你收到了這個 Awk 代碼,但沒有解釋它是如何工作的,或者如果它損壞了如何修復它......?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.