1 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊
外部引號(hào)是不必要的。當(dāng)您有 shell 時(shí),需要使用單引號(hào)來(lái)保護(hù) Awk 腳本免受 shell 的影響;但在這里,你沒(méi)有外殼。然后你可以而且也應(yīng)該去掉所有這些反斜杠。
如果您只需要運(yùn)行子進(jìn)程,然后在完成后繼續(xù)您的程序,那么您應(yīng)該更喜歡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 的子進(jìn)程運(yùn)行幾乎總是不必要的。您應(yīng)該能夠?qū)⑵渲貥?gòu)為大致相同數(shù)量的 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
這有點(diǎn)冗長(zhǎng),但這主要是因?yàn)槲沂褂昧烁呙枋鲂缘淖兞棵Q(chēng)。如果您的輸入文件確實(shí)是一個(gè) CSV 文件,csvPython 標(biāo)準(zhǔn)庫(kù)中的模塊可以方便地替換分割邏輯等,盡管它隨后引入了自己的一些其他特性。如果您必須處理 CSV 中的引號(hào)逗號(hào)等,那么這就是它真正增加價(jià)值的地方。
總而言之,Awk更簡(jiǎn)潔,但那是因?yàn)樗鼘?zhuān)業(yè)。將其嵌入到 Python 代碼中的主要缺點(diǎn)是讀者必須了解兩種語(yǔ)言才能理解代碼(盡管避免外部過(guò)程也總是好的)。我冒昧地猜測(cè),您收到了這段 Awk 代碼,但沒(méi)有任何解釋它是如何工作的,或者如果它損壞了如何修復(fù)它......?
添加回答
舉報(bào)