在python脚本中使用awk时出现格式问题

在python脚本中使用awk时出现格式问题,python,awk,Python,Awk,我正在尝试用python脚本编写以下命令: cmd = '''awk '{printf "%.6f %.6f %.6f\n",$1-10.0,$2,$3}' %s.txt > %s.txt''' % (file_name_1, file_name_2) call(cmd, shell=True) 但由于参数问题,它无法执行。前三个“%.6f”表示awk输出格式,后两个“%s”表示文件名。我试图在“=”之后添加“r”,但不起作用 谢谢 命令中的\n字符不是作为\n传递给awk的,而是作

我正在尝试用python脚本编写以下命令:

cmd = '''awk '{printf "%.6f  %.6f  %.6f\n",$1-10.0,$2,$3}' %s.txt > %s.txt''' % (file_name_1, file_name_2)
call(cmd, shell=True)
但由于参数问题,它无法执行。前三个
“%.6f”
表示awk输出格式,后两个
“%s”
表示文件名。我试图在
“=”
之后添加
“r”
,但不起作用


谢谢

命令中的
\n
字符不是作为
\n
传递给
awk
的,而是作为命令行中的换行符

您需要使用原始前缀,以便按字面形式传递
\n

cmd = r'''awk '{printf "%.6f  %.6f  %.6f\n",$1-10.0,$2,$3}' %s.txt > %s.txt''' %  (file_name_1, file_name_2)
(是的,多亏了阅读,我发现我忘记了将
%
字符加倍,所以这并不是一个非常方便的解决方案,除非您使用
格式,否则修复只是部分)

使用
str.format
和双引号(此处不需要三重单引号):

更好的是,在纯python中使用迭代行上的
open
str.split
和浮点转换重写此代码。未经测试,但应工作良好:

with open(file_name_1+".txt") as fr, open(file_name_2+".txt","w") as fw:
    for line in fr:
      toks = [float(x) for x in line.split()]
      fw.write("%.6f  %.6f  %.6f\n" % (toks[0]-10,toks[1],toks[2]))
  • 更便携(不需要awk,例如Windows上的awk)
  • 如果文件名中有空格,这不是问题
  • 避免系统调用

您需要将格式字符串中的
%
加倍,才能在结果字符串中插入文字百分比字符

cmd = r'''awk '{printf "%%.6f  %%.6f  %%.6f\n",$1-10.0,$2,$3}' %s.txt > %s.txt''' % (file_name_1, file_name_2)
# ......................^^.....^^.....^^
例如:

$ python
Python 2.7.12 (default, Dec  4 2017, 14:50:18) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> file_name_1 = 'foo'
>>> file_name_2 = 'bar'
>>> cmd = '''awk '{printf "%.6f  %.6f  %.6f\n",$1-10.0,$2,$3}' %s.txt > %s.txt''' % (file_name_1, file_name_2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: float argument required, not str
>>> cmd = r'''awk '{printf "%%.6f  %%.6f  %%.6f\n",$1-10.0,$2,$3}' %s.txt > %s.txt''' % (file_name_1, file_name_2)
>>> cmd
'awk \'{printf "%.6f  %.6f  %.6f\\n",$1-10.0,$2,$3}\' foo.txt > bar.txt'
$python
Python 2.7.12(默认值,2017年12月4日,14:50:18)
[GCC 5.4.0 20160609]关于linux2
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>文件名\u 1='foo'
>>>文件名\u 2='bar'
>>>cmd=''awk'{printf'%.6f%.6f%.6f\n',$1-10.0,$2,$3}'%s.txt>%s.txt''%(文件名\u 1,文件名\u 2)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:需要浮点参数,而不是str
>>>cmd=r''awk'{printf'%.6f%%.6f%%.6f%%.6f\n',$1-10.0,$2,$3}'%s.txt>%s.txt''%(文件名\u 1,文件名\u 2)
>>>指令
“awk\{printf”%.6f%.6f%.6f\\n“,$1-10.0,$2,$3}\'foo.txt>bar.txt”

为什么要使用
awk
来完成这项工作,而python也可以这样做?问题在于
\n
。使用原始字符串进行此操作。我更熟悉此操作。我尝试了你的解决方案,但它没有像我在问题中提到的那样有效。好的。感谢发布python解决方案。大家好,投票支持Jean-François Fabre的答案。感谢发布此帖子@格伦尼查克曼:谢谢:)我也投票赞成你的答案,因为它显示了发生了什么。
$ python
Python 2.7.12 (default, Dec  4 2017, 14:50:18) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> file_name_1 = 'foo'
>>> file_name_2 = 'bar'
>>> cmd = '''awk '{printf "%.6f  %.6f  %.6f\n",$1-10.0,$2,$3}' %s.txt > %s.txt''' % (file_name_1, file_name_2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: float argument required, not str
>>> cmd = r'''awk '{printf "%%.6f  %%.6f  %%.6f\n",$1-10.0,$2,$3}' %s.txt > %s.txt''' % (file_name_1, file_name_2)
>>> cmd
'awk \'{printf "%.6f  %.6f  %.6f\\n",$1-10.0,$2,$3}\' foo.txt > bar.txt'