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

时间:2018-09-06 21:09:02

标签: python awk

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

css

但是由于参数问题而无法执行。前三个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) 用于awk输出格式,后两个"%.6f"用于文件名。我试图在"%s"之后添加"r",但是它不起作用。

谢谢!

2 个答案:

答案 0 :(得分:1)

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

您需要使用原始前缀,以便按原样传递\n

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

(是的,感谢阅读Glenn other answer,我发现我忘了将%字符加倍,因此,除非您使用format,否则确实不是非常方便的解决方案,此解决方法只是部分)

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

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

更好的是,在迭代行和浮点转换上使用openstr.split用纯python重写它。未经测试,但效果很好:

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]))
  • 更便携(在Windows上不需要awk
  • 如果文件名中包含空格,这不是问题
  • 避免系统调用

答案 1 :(得分:1)

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

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'