我有以下awk命令:
awk FPAT="([^,]+)|("[^"]+")" '{ print $7048 }' ...
我想使用CCD_ 1提交它,但我找不到正确的方法来用所有特殊字符在python字符串中编写代码。以下是我的最新尝试:
cmd = " awk -v FPAT="([^,]+)|(\""[^\""]+\"")"" ' {{ print %s }} ' %s > %s" .format(c,input,output)
我得到以下结果:
' awk -v FPAT="([^,]+)|(\[^\]+\) ' { print %s } ' %s > %s'
有人能帮帮我吗?
您混淆了%
运算符使用的占位符和format
方法使用的字段说明符。
cmd = "awk -v FPAT="([^,]+)|(\""[^\""]+\"")"" ' {{ print {} }} ' {} > {}" .format(c, input, output)
此外,您应该使用subprocess
模块而不是os.system
。Python可以处理输出重定向,因此不需要shell。
with open(output, "w") as f:
subprocess.run(["awk", "-v", 'FPAT=([^,]+)|("[^\"]+")', '{{ print {} }}'.format(c), input])
假设Python 3.6或更高版本,则可以使用f-string文字来简化awk
脚本。
with open(output, "w") as f:
subprocess.run(["awk", "-v", 'FPAT=([^,]+)|("[^\"]+")', f'{{ print {c} }}', input])
您可以使用input()
方便地将文本转换为字符串,然后将其复制粘贴到源代码中:
>>> cmd = input()
awk FPAT="([^,]+)|("[^"]+")" '{ print $7048 }' ...
>>> cmd
' awk FPAT="([^,]+)|(\"[^\"]+\")" '{ print $7048 }' ...'
在Python 2中,请改用raw_input()
。
顺便说一句,避免使用input
作为变量名,因为它会隐藏内置的os.system(cmd)
0,并且会使此方法不起作用。
或者,如果文本不包含任何三引号,则可以使用三引号原始字符串:
>>> cmd = r''' awk FPAT="([^,]+)|("[^"]+")" '{ print $7048 }' ...'''
>>> cmd
' awk FPAT="([^,]+)|(\"[^\"]+\")" '{ print $7048 }' ...'
感谢Charles Duffy在评论中建议使用原始字符串选项