1 回答

TA貢獻1802條經驗 獲得超10個贊
外部引號是不必要的。當您有 shell 時,需要使用單引號來保護 Awk 腳本免受 shell 的影響;但在這里,你沒有外殼。然后你可以而且也應該去掉所有這些反斜杠。
如果您只需要運行子進程,然后在完成后繼續您的程序,那么您應該更喜歡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 文件,csvPython 標準庫中的模塊可以方便地替換分割邏輯等,盡管它隨后引入了自己的一些其他特性。如果您必須處理 CSV 中的引號逗號等,那么這就是它真正增加價值的地方。
總而言之,Awk更簡潔,但那是因為它更專業。將其嵌入到 Python 代碼中的主要缺點是讀者必須了解兩種語言才能理解代碼(盡管避免外部過程也總是好的)。我冒昧地猜測,您收到了這段 Awk 代碼,但沒有任何解釋它是如何工作的,或者如果它損壞了如何修復它......?
添加回答
舉報