簡體   English   中英

需要使用子進程模塊在 python 腳本中運行 AWK 命令

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM