在python脚本中使用awk时出现格式问题
我正在尝试用python脚本编写以下命令:在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的,而是作
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'