为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

GCT1015 2023-12-09 15:36:00
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 时,我不断收到错误:“表达式中的字符'''无效。”
查看完整描述

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 代码,但没有任何解释它是如何工作的,或者如果它损坏了如何修复它......?


查看完整回答
反对 回复 2023-12-09
  • 1 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信