【问题标题】:Need to run AWK command in python script using subprocess module需要使用子进程模块在 python 脚本中运行 AWK 命令
【发布时间】:2021-02-03 12:41:43
【问题描述】:
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 运行时,我不断收到错误消息:“invalid char ''' in expression。”

【问题讨论】:

    标签: python awk subprocess sh


    【解决方案1】:

    外部引号是不必要的。当你有一个 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 文件,Python 标准库中的 csv 模块可以方便地替换拆分逻辑等,尽管它随后引入了它自己的一些其他特性。如果您必须在 CSV 中处理带引号的逗号等,那才是真正增加价值的地方。

    所有事情都算数,Awk 更简洁,但那是因为它更专业。将其嵌入 Python 代码的主要缺点是读者必须理解两种语言才能理解代码(尽管避免外部进程也总是不错的)。我冒昧地猜测,你收到了这个 Awk 代码,但没有解释它是如何工作的,或者如果它坏了如何修复它......?

    【讨论】:

      猜你喜欢
      • 2018-02-07
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      相关资源
      最近更新 更多