需要使用子进程模块在python脚本中运行AWK命令

时间:2020-10-20 16:23:46

标签: python awk subprocess sh

dplyr::transmute

此命令在shell脚本中运行良好。因此,命令参数似乎很好。但是在通过python运行时,我不断收到错误:“表达式中的无效char'''。

1 个答案:

答案 0 :(得分:1)

外部引号是不必要的。如果您拥有外壳,则必须使用单引号将Awk脚本从外壳中保护掉;但是在这里,您没有外壳。然后,您可以并且也应该摆脱所有这些反斜杠。

如果只需要运行子流程,则应该优先选择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代码的,如果它损坏了怎么解决...?